这是两个类,
class A
{
}
class B extends A
{
}
和 A 继承自 B 。让我感到困惑的是,当我使用以下代码时创建了多少个对象
A a = new B();
我知道当我创建 B 的实例时,它会首先调用 A 的构造函数,然后调用 B的构造函数' S
。
调用 A 的构造函数时是否创建了 A 的实例?
A a = new B();
答案 0 :(得分:3)
创建了一个对象,该对象是B
对象,其中包含A
定义的方面和B
定义的方面。由于它包含了两者所定义的所有方面,因此它instanceof
A
和B
。
...
A
继承自B
A
由 B
继承,而不是来自 。 (这些小词在非母语中是最难的。)B
从 A
继承。关于此问题的一些常用术语:" B
源自A
"," B
源自A
",& #34; A
是B
"的超类," B
是A
"的子类。
调用
A
的构造函数时是否创建了A
的实例?
尽管他们的名字,施工人员不会创造物品;他们初始化他们;这个问题就是为什么:有时为了正确初始化对象,你必须调用多个构造函数(对象的继承层次结构中的每个级别都有一个)。在new B()
中,JVM创建对象,然后调用B
并将this
设置为该新的空白对象,以便B
可以初始化它。 B
做的第一件事就是调用A
让它初始化对象的A
方面,然后B
初始化对象的B
方面。 E.g:
B
B
来电A
A
初始化其负责并返回B
初始化其负责并返回答案 1 :(得分:3)
它创建一个对象,它是B
的一个实例。当B
构造函数执行时,它已经是A
,因为您将看到是否将代码更改为:
class A {
public A() {
System.out.println(getClass());
}
}
class B extends A {
}
...
A a = new B(); // Prints B in the A constructor
基本上,构造函数不是创建对象的东西 - 它是在该类的上下文中初始化对象的内容。
因此,您可以将步骤视为:
(构造函数链接 up 继承树评估构造函数参数,当然......虽然构造函数也被称为上行链接,因为第一个任何构造函数的一部分必须链接到同一个类或超类,构造函数体的主要部分自上而下发生。)
有关完全的详细信息,请参阅JLS 15.9.4和JLS 12.5。
答案 2 :(得分:1)
只创建了B
的一个实例。
可以在链中调用构造函数,但每次调用仅对您正在创建的单个实例起作用。
答案 3 :(得分:0)
正如我上面已经说过的那样:只创建了一个对象。为了澄清这一点,您可能会想到刚刚写下的声明的三个部分:
A a = new B()
。这些是声明A a
的一部分,是实例化new
的一部分,也是初始化B()
的一部分。
如果您想阅读这个主题(因为可能并非一切都清楚了),请考虑访问https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html