繁体   English   中英

从抽象类继承

[英]inheritance from abstract class

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

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中具有私有访问权限”

我认为 :

  1. 字段始终是私有的

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

我现在应该如何进行?

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

标示为现场privatesuper类和继承的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方法来设置超类中的字段。

首先,抽象类和普通类有什么区别? 您不能实例化一个Abstract类,因此它是专门为晚餐类设计的。 普通类可以随时实例化。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM