我正在研究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()创建的父类对象?”
答案 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
的成员为CompCalculator
。 HumanCalculator
有一个名为CompCalculator
的字段,就像madeBy
也有HumanCalculator
一样。这就是为什么madeBy
中的行会成功运行的原因。
通常,在调用HumanCalculator
之后,您将进行一些对子类唯一的初始化。只是调用super
而不做任何其他事情是一个非常特殊的情况。