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

Why subclasses inherit private fields?

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

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;
    }
}

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

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

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

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