从抽象类继承

问题描述 投票:0回答:2

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

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”中,当我输入“capacity”作为在构造函数中使用的变量时,它表示“容量在abstractcar中具有私有访问权限”

我以为 :

  1. 字段总是私有的
  2. 子类是否继承了超类的所有字段和方法?

我现在该怎么办?

java class inheritance abstract
2个回答
1
投票

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

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

[非推荐解决方案]

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

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

  1. 您可以将超类中的字段声明为protected。受保护的字段可在子类中访问。
  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 modifier。您可以调用这些setter方法来设置超类中的字段。


0
投票

首先,Abstract类和普通类之间有什么区别?您无法实例化Abstract类,因此它仅适用于超类。普通类可以随时实例化。

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

© www.soinside.com 2019 - 2024. All rights reserved.