为啥子类继承私有字段?

Posted

技术标签:

【中文标题】为啥子类继承私有字段?【英文标题】: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(...) 它也在使用超类私有变量它在哪里使用超类的字段? 【参考方案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。但无论如何我无法访问车辆名称,因为它是私人的。这就是私有修饰符的使用方式。

以上是关于为啥子类继承私有字段?的主要内容,如果未能解决你的问题,请参考以下文章

在JavaScript的原型链继承方式中,为啥子类在调用父类的构造函数时不能传参数?

在继承中访问私有成员

C# 类继承中的私有字段都去了哪里?

私有字段和方法是不是被继承? [复制]

OOP 和私有字段的继承

java里,为啥子类不可以有 和父类 同名不同返回类型 的方法?