为什么子类继承私有字段?

Why subclasses inherit private fields?

提问人: 提问时间:11/26/2021 最后编辑:ernest_k 更新时间:11/26/2021 访问量:138

问:

我正在创建一个新类,即车辆。我希望唯一受保护的变量继承到子类。但是当我尝试使用 IDE 创建构造函数时,它也使用了超类私有变量?-这是私人字符串 vehicleName- 我不清楚这种情况。我不应该使用 auto Concstructor 吗?

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;
    }
}
Java OOP 继承 构造函数 access-specifier

评论

0赞 ernest_k 11/26/2021
您的 IDE 知道,在调用构造函数 from 之前,无法构造。现在,没有无参数构造函数,这意味着必须在 中调用非默认构造函数。这只有在它使用超类构造函数的所有参数创建一个构造函数时才能起作用,它用于调用LandVehicleVehicleVehicleLandVehicleVehicleLandVehiclesuper(...)
1赞 Sotirios Delimanolis 11/26/2021
它还使用超类私有变量它在哪里使用超类的字段?

答:

1赞 Alex Sveshnikov 11/26/2021 #1

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

评论

0赞 11/26/2021
当我尝试创建新的 obj 时,我必须给出一个 vehicleName,例如 LandVehicle landV = new LandVehicle(25,“Bergen-Cologne”, “vehicleName”, “Man”, 2009);但是当我尝试从 LandVehicle 创建 obj 时,我不想给出 vehicleName
0赞 11/26/2021
我想我想要的不是很适合OOP。在使用构造函数创建新的 obj 时,我必须给出一个 vehicleName。但无论如何,我无法访问 vehicleName,因为它是私有的。这就是私有修饰符的使用方式。
1赞 davidrhp 11/26/2021 #2

通常,一个类有一个默认的构造函数,不带参数,如果你没有提供任何构造函数。

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

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