java - 从抽象类继承

标签 java class inheritance abstract

它与从可实现的普通父类(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)访问权限”

我认为:

  1. 字段始终是私有(private)的,

  2. 子类继承父类的所有字段和方法?

我现在应该如何进行?

最佳答案

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

super 类中标记为 private 且由 sub 类继承的字段是 sub< 对象的一部分 类,但无法在 sub 类中进行修改

[不推荐的解决方案]

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

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

  1. 您可以将父类(super class)中的字段声明为 protected 。 protected 字段可以在子类中访问。
  2. 如果子类和父类(super class)共享相同的包,则不能应用任何修饰符(默认包级别)。它将使得子类可以访问该字段。
  3. 您可以将该字段声明为公共(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/

相关文章:

Python __init__(a,b,c,d) 不识别 "self"作为参数

C# 和继承。对象为扩展类对象时基类属性为null

c++ - 从子类c++调用基类方法

javascript - 如何从基础对象继承函数并在javascript中覆盖它

java - LinkedHashMap 怎么会找不到迭代器生成的条目呢?

java - Dagger + retrofit 。在运行时添加身份验证 header

java - 对设置彩色图像的中值感到困惑

javascript - 未捕获的类型错误 : Class constructor Hero cannot be invoked without 'new'

Java swing jTable 未更新

c++ - 为什么 C++ 不支持模板(非静态)成员变量?