【问题标题】:inheritance from abstract class从抽象类继承
【发布时间】:2018-03-03 22:14:46
【问题描述】:

与从可以实现的普通超类继承有什么不同吗?

atm 我有一个名为abstractcar 的抽象类,我有bigcar / smallcar 扩展了这个abstract class

public abstract class AbstractCar{
    private int capacity;
}

class BigCar extends AbstractCar{}

class SmallCar extends AbstractCar{}

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

但是在子类“smallcar”中,当我键入“容量”作为要在构造函数中使用的变量时,它说“容量在 abstractcar 中具有私有访问权限”

我以为:

  1. 字段始终是私有的,并且

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

我现在应该如何进行?

【问题讨论】:

  • 字段是您设置的任何可见性。子类继承所有字段和方法,但这并不意味着它们可以访问它们。
  • 1) 字段并不总是private,您可以将它们设为protectedpublic(尽管最好使用访问器)。 2) 对。但他们无法访问private 字段。
  • 如果你想访问抽象类中的字段,它们应该受到保护。看看docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  • 但是如果子类继承了一个字段,即使它最初被标记为“私有”,该字段也是子类对象的一部分?您是说要让子类主动使用或修改超类/抽象类中的字段值,该字段变量必须至少设置为“受保护”?这背后的原因是什么??
  • 从超类继承的私有字段是子类对象的一部分,但在子类中无法修改。你可以参考下面我的回答

标签: java class inheritance abstract


【解决方案1】:

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

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

[不推荐的解决方案]

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

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

  1. 您可以将超类中的字段声明为受保护。受保护的字段可在子类中访问。
  2. 如果子类和超类共享同一个包,则不能应用修饰符(默认包级别)。它将使子类可以访问该字段。
  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 方法来设置超类中的字段。

【讨论】:

    【解决方案2】:

    首先抽象类和普通类有什么区别?你不能实例化一个抽象类,所以它是专门为超级类设计的。普通类可以随时实例化。

    现在继承,它是什么?继承意味着您可以将已设计类的所有数据成员和方法继承到另一个类中,并将其功能/行为作为单个实体使用。当您继承一个超级类时,无论它是抽象类还是常规类,它的所有数据成员和方法都按原样继承,这意味着所有私有成员作为私有成员和保护成员作为保护成员,公共作为公共成员,并且相同的访问机制将是实施的。在这种情况下,您必须在超级类中将数据成员声明为保护性或公共数据成员才能直接从子类访问,否则您必须在超级类中实现 setter 和 getter 方法才能访问私有成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      相关资源
      最近更新 更多