为什么子类继承私有字段?
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
时,你的 LandVehicle
是 Vehicle
的一种。这意味着它从其 superclass 继承方法和字段,即使它们是私有的。对于 class LandVehicle
这些成员只是不可见,但它们仍然存在 - 否则无法正常运行。 private 关键字是一个访问修饰符,它改变了调用者的可见性。
因此,要实例化一个 LandVehicle
,您还必须提供其 superclass Vehicle
所需的属性(因为没有默认的无参数构造函数Vehicle
)。在您的示例中,没有名称(来自 Vehicle
)的 LandVehicle
没有意义,因为 LandVehicle
是 Vehicle
,它需要一个名称。
我正在创建一个新的 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
时,你的 LandVehicle
是 Vehicle
的一种。这意味着它从其 superclass 继承方法和字段,即使它们是私有的。对于 class LandVehicle
这些成员只是不可见,但它们仍然存在 - 否则无法正常运行。 private 关键字是一个访问修饰符,它改变了调用者的可见性。
因此,要实例化一个 LandVehicle
,您还必须提供其 superclass Vehicle
所需的属性(因为没有默认的无参数构造函数Vehicle
)。在您的示例中,没有名称(来自 Vehicle
)的 LandVehicle
没有意义,因为 LandVehicle
是 Vehicle
,它需要一个名称。