从抽象继承 class

inheritance from abstract class

它与继承一个可以实现的普通superclass有什么不同吗?

atm 我有一个名为 abstractcar 的抽象 class 并且我有 bigcar / smallcar 扩展这个 abstract class.

public abstract class AbstractCar{
    private int capacity;
}

class BigCar extends AbstractCar{}

class SmallCar extends AbstractCar{}

abstractcar中的一个字段设置为"private int capacity"

但是在 subclass "smallcar" 中,当我键入 "capacity" 作为要在构造函数中使用的变量时,它说 "capacity has private access in abstractcar"

我认为:

  1. 字段始终是私有的,

  2. 一个subclass继承了superclass?

  3. 的所有字段和方法

我现在应该如何进行?

实例方法和字段由 super class 的派生 class 继承,但这并不意味着它们是 也可以访问

superclass中标记为private并被sub继承的字段class是[=对象的一部分14=] class 但无法在 sub class

中进行修改

[非推荐方案]

实例字段应始终声明为 'private'。不这样做是一种错误的做法。但为了理解观点,我提出以下 3 点,然后是推荐方式。

您需要将该字段声明为非私有字段,以便子 class 可以访问它。

  1. 您可以将 super class 中的字段声明为受保护。子 class.
  2. 中可访问受保护的字段
  3. 如果 sub class 和 super class 共享同一个包,则不能应用修饰符(默认包级别)。它将使子 class.
  4. 可以访问该字段
  5. 您可以将字段声明为 public。在这种情况下,每个 class.
  6. 都可以访问该字段

[推荐方案]

添加一种在 super class 中设置字段的方法。如果该字段是对象生命的一部分(必需字段),那么您可以在 Super class 中创建一个构造函数,否则您可以拥有 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.

中的字段

首先抽象class和普通class有什么区别?你不能实例化一个抽象 class 所以它是专门为晚餐 class 设计的。正常的 class 可以随时实例化。

现在继承,是什么?继承意味着您可以将已经设计的 class 的所有数据成员和方法继承到另一个 class 中,并将其 functionality/behaviours 作为一个实体来使用。当你继承一个晚餐时 class 不管它是抽象的还是常规的 class 它的所有数据成员和方法都照原样继承,意味着所有私有成员作为私有成员和保护成员作为保护和 public 与 public 相同的访问机制将被实现。在这种情况下,您要么必须将数据成员声明为保护性的,要么必须在晚餐 class 中声明数据成员 public 以直接从子 class 访问,否则您必须实现 setter 和 getter 方法在你的晚餐 class 中访问私有成员。