使用super()进行Java继承;

时间:2018-04-14 11:17:02

标签: java inheritance

我正在研究java继承,并对下面的问题感到困惑。

当B类继承A类时,

我们只是写为

class B extends A{

}

当我创建新的B对象时,

B b = new B();

在创建b之前,JVM使用super();

在内部创建超类的对象
super();

那么,b实际上是继承了父类的对象吗?

我提出这个问题是因为下面的代码让我感到困惑。

class HumanCalculator {
    String madeBy;

    HumanCalculator(String madeBy){
        this.madeBy = madeBy;
    }

}

class CompCalculator extends HumanCalculator {
    CompCalculator(String madeBy){
        super(madeBy);
    }
}

public class Calculator {
    public static void main(String[] args){
        CompCalculator test = new CompCalculator("USA");

        System.out.println(test.madeBy);
    }
}

CompCalculator构造函数实际上没有

this.madeBy = madeBy;

但结果是美国,

所以问题又是,

“b实际上是否继承了由super()创建的父类对象?”

2 个答案:

答案 0 :(得分:1)

  

在创建b之前,JVM使用super();

在内部创建超类的对象

没有。创建一个B类型的对象。调用super()时调用超类(A)的构造函数。在执行B构造函数的其余指令之前,此构造函数完成了部分工作。

在您的具体示例中,HumanCalculator构造函数初始化正在创建的CompCalculator类型的对象的字段madeBy

答案 1 :(得分:0)

对象不会继承其他对象。类可以继承其他类。可以使用一个C类的对象"就好像它是C"的超类的对象。

当您说print()时,CompCalculator extends HumanCalculator将拥有CompCalculator的成员。这就是为什么它可以像HumanCalculator一样使用。

HumanCalculator构造函数调用只是说"只需按照构建super"的步骤构建CompCalculator。您可以这样做,因为HumanCalculator的成员为CompCalculatorHumanCalculator有一个名为CompCalculator的字段,就像madeBy也有HumanCalculator一样。这就是为什么madeBy中的行会成功运行的原因。

通常,在调用HumanCalculator之后,您将进行一些对子类唯一的初始化。只是调用super而不做任何其他事情是一个非常特殊的情况。