【问题标题】:Why subclasses inherit private fields?为什么子类继承私有字段?
【发布时间】:2022-01-04 01:19:35
【问题描述】:

我正在创建一个新的类,它是车辆。我期待唯一受保护的变量继承给子类。但是当我尝试使用 IDE 创建构造函数时,它是否也在使用超类私有变量? - 这是私人字符串车辆名称 - 我不清楚这种情况。我不应该使用自动构造函数吗?

public class Vehicle {
    protected int capacityOfPassengers;
    protected String mapOfRoute;
    private String vehicleName;

    public Vehicle(int capacityOfPassengers, String mapOfRoute, 
                   String vehicleName) {

        this.capacityOfPassengers = capacityOfPassengers;
        this.mapOfRoute = mapOfRoute;
        this.vehicleName = vehicleName;
    }
}

public class LandVehicle extends Vehicle {
    private String brand;
    private int priceModel;

    public LandVehicle(int capacityOfPassengers, String mapOfRoute, 
                       String vehicleName, String brand, int priceModel) {

        super(capacityOfPassengers, mapOfRoute, vehicleName);
        this.brand = brand;
        this.priceModel = priceModel;
    }
}

【问题讨论】:

  • 您的 IDE 知道在调用来自 Vehicle 的构造函数之前无法构造 LandVehicle。现在,Vehicle 没有无参数构造函数,这意味着LandVehicle 必须调用Vehicle 中的非默认构造函数。这只有在 LandVehicle 中创建一个带有超类构造函数的所有参数的构造函数时才有效,它用于调用 super(...)
  • 它也在使用超类私有变量它在哪里使用超类的字段?

标签: java oop inheritance constructor access-specifier


【解决方案1】:

一般来说,一个类有一个默认构造函数,不带参数,如果你没有提供构造函数。

当您使用您的LandVehicle 子类化Vehicle 时,您的LandVehicleVehicle 的一种类型。这意味着它从其超类继承方法和字段,即使它们是私有的。对于 LandVehicle 类,这些成员只是不可见,但它们仍然存在 - 否则它无法正常运行。 private 关键字是一个访问修饰符,它改变调用者的可见性。

因此,要实例化LandVehicle,您还必须提供其超类Vehicle 的必需属性(因为Vehicle 中没有默认的、无参数的构造函数)。在您的示例中,没有名称的LandVehicle(来自Vehicle)没有意义,因为LandVehicleVehicle,它需要一个名称。

【讨论】:

    【解决方案2】:

    您无法从 LandVehicle 访问车辆名称。您只需将一些字符串参数传递给超级构造函数,超级构造函数就会设置车辆名称。例如,您不能将 LandVehicle 类中的该字段初始化为this.vehicleName = vehicleName

    【讨论】:

    • 当我尝试创建像 LandVehicle landV = new LandVehicle(25,"Bergen-Cologne", "vehicleName", "Man", 2009) 这样的新 obj 时,我必须提供一个 vehicleName但是当我尝试从 LandVehicle 创建 obj 时,我不想给出车辆名称
    • 我想我想要的不是很适合OOP。在使用构造函数创建新 obj 时,我必须提供一个 vehicleName。但无论如何我无法访问车辆名称,因为它是私人的。这就是私有修饰符的使用方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2019-04-26
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多