它与从可实现的普通父类(super class)继承有什么不同吗?
atm 我有一个名为 abstractcar
的抽象类,并且我有 bigcar
/smallcar
扩展了这个抽象类
。
public abstract class AbstractCar{
private int capacity;
}
class BigCar extends AbstractCar{}
class SmallCar extends AbstractCar{}
abstractcar 中的一个字段被设置为“私有(private) int 容量”
但是在子类“smallcar”中,当我输入“capacity”作为要在构造函数中使用的变量时,它会显示“capacity在abstractcar中具有私有(private)访问权限”
我认为:
字段始终是私有(private)的,
子类继承父类的所有字段和方法?
我现在应该如何进行?
最佳答案
实例方法和字段由 super
类的派生类继承,但这并不意味着它们也可访问。
在 super
类中标记为 private
且由 sub
类继承的字段是 sub< 对象的一部分
类,但无法在 sub
类中进行修改
[不推荐的解决方案]
实例字段应始终声明为“私有(private)”。不这样做是一种不好的做法。但为了理解观点,我提出以下 3 点,然后是推荐方式。
您需要将该字段声明为非私有(private)字段,以便子类可以访问它。
- 您可以将父类(super class)中的字段声明为 protected 。 protected 字段可以在子类中访问。
- 如果子类和父类(super class)共享相同的包,则不能应用任何修饰符(默认包级别)。它将使得子类可以访问该字段。
- 您可以将该字段声明为公共(public)字段。在这种情况下,每个类都可以访问该字段。
[推荐解决方案]
添加一种在父类(super class)中设置字段的方法。如果该字段是对象生命的一部分(基本字段),那么您可以在 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方法来设置父类(super class)中的字段。
关于java - 从抽象类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49089791/