这里有两个类,
class A
{
}
class B extends A
{
}
和A继承自B。令我困惑的是,当我使用以下代码时,创建了多少个对象
A a = new B();
我知道当我创建一个B的实例时,它会先调用A的构造函数,然后再调用B的构造函数' s.
调用A的构造函数时是否创建了A的实例?
在
A a = new B();
最佳答案
它创建一个对象,它是 B
的一个实例。当 A
构造函数执行时,它已经是一个 B
了,如果您将代码更改为:
class A {
public A() {
System.out.println(getClass());
}
}
class B extends A {
}
...
A a = new B(); // Prints B in the A constructor
基本上,构造函数不是创建对象的东西 - 它是初始化该类上下文中的对象的东西。
所以你可以把这些步骤想成:
- 创建类型B的对象
- 在 A 的上下文中初始化对象(字段初始化器、构造函数体)
- 在B的上下文中初始化对象(字段初始化器、构造函数体)
(随着构造函数链接 向上 继承树评估构造函数参数,当然......虽然构造函数也被称为向上链,作为第一个 任何构造函数的一部分都必须链接到同一个类或父类(super class),构造函数主体的主要部分自上而下发生)。
有关确切发生的更多详细信息,请参阅JLS 15.9.4和 JLS 12.5 .
关于java - 在 B 继承自 A 的情况下创建了多少个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39444960/