与从可以实现的普通超类继承有什么不同?
atm我有一个名为abstractcar
的抽象类,并且我有bigcar
/ smallcar
扩展了此abstract class
。
public abstract class AbstractCar{
private int capacity;
}
class BigCar extends AbstractCar{}
class SmallCar extends AbstractCar{}
abstractcar的字段之一设置为“私有int容量”
但是在子类“ smallcar”中,当我键入“ capacity”作为要在构造函数中使用的变量时,它表示“ capacity在abstractcar中具有私有访问权限”
我以为 :
字段始终是私有的
子类继承超类的所有字段和方法?
我现在应该如何进行?
最佳答案
实例方法和字段由super
类的派生类继承,但这并不意味着它们也可访问。
在private
类中标记为super
且由sub
类继承的字段是sub
类的对象的一部分,但在sub
类中不可修改
[不推荐的解决方案]
实例字段应始终声明为“私有”。不这样做是一种不良做法。但是为了理解观点,我在下面提出3点,然后提出建议的方式。
您需要将字段声明为非私有字段,以便子类可以访问它。
您可以将超类中的字段声明为受保护的。在子类中可以访问受保护的字段。
如果子类和超类共享同一程序包,则不能应用修饰符(默认程序包级别)。它将使子类可以访问该字段。
您可以将该字段声明为公共字段。在这种情况下,每个班级都可以访问该字段。
[推荐解决方案]
添加一种在超类中设置字段的方法。如果字段是对象生命的一部分(必需字段),则可以在Super类中创建构造函数,否则可以使用setter方法并可以调用它们。
public abstract class AbstractCar{
private int capacity;
public AbstractCar(int capacity) {
this.capacity = capacity;
}
}
class BigCar extends AbstractCar{
public BigCar() {
super(6);
}
}
class SmallCar extends AbstractCar{
public SmallCar() {
super(4);
}
}
您还可以定义setter方法,并可以使用protected修饰符。您可以调用这些setter方法来设置超类中的字段。