为啥子类继承私有字段?
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
时,您的LandVehicle
是Vehicle
的一种类型。这意味着它从其超类继承方法和字段,即使它们是私有的。对于 LandVehicle
类,这些成员只是不可见,但它们仍然存在 - 否则它无法正常运行。 private 关键字是一个访问修饰符,它改变调用者的可见性。
因此,要实例化LandVehicle
,您还必须提供其超类Vehicle
的必需属性(因为Vehicle
中没有默认的、无参数的构造函数)。在您的示例中,没有名称的LandVehicle
(来自Vehicle
)没有意义,因为LandVehicle
是Vehicle
,它需要一个名称。
【讨论】:
【参考方案2】:您无法从 LandVehicle 访问车辆名称。您只需将一些字符串参数传递给超级构造函数,超级构造函数就会设置车辆名称。例如,您不能将 LandVehicle 类中的该字段初始化为this.vehicleName = vehicleName
。
【讨论】:
当我尝试创建像 LandVehicle landV = new LandVehicle(25,"Bergen-Cologne", "vehicleName", "Man", 2009) 这样的新 obj 时,我必须提供一个 vehicleName但是当我尝试从 LandVehicle 创建 obj 时,我不想给出车辆名称 我想我想要的不是很适合OOP。在使用构造函数创建新 obj 时,我必须提供一个 vehicleName。但无论如何我无法访问车辆名称,因为它是私人的。这就是私有修饰符的使用方式。以上是关于为啥子类继承私有字段?的主要内容,如果未能解决你的问题,请参考以下文章