如果创建了子类的对象,会创建父类的对象吗?

Shu*_*rma 6 java inheritance

我知道每次我们创建子类对象时都会调用 super 。但是,我特别想知道的是它会加载该类还是会创建该父类的对象。

提前致谢。

dav*_*xxx 4

你只有一个对象
当类被实例化时,它首先调用父类的构造函数。对于每个父类,它遵循相同的逻辑:它首先调用父类的构造函数。

假设:A扩展B扩展C

new A()结果是B调用构造函数本身的构造函数调用C
当返回构造函数调用时,C构造函数可以继续并创建实例。BAA

但是,我特别想知道的是它会加载该类还是会创建该父类的对象。

与构造函数执行类似,在加载类之前,必须加载其父类first,并且对于每个父类递归地加载。

这里的类对应于Aextends Bextends C

class C {
    public C(){    
        System.out.println("C constructor");
    }
}

class B extends C{
    public B() {
        System.out.println("B constructor");
    }

}
class A extends B{
    public A() {
        System.out.println("A constructor");
    }
}


public class Test {
    public static void main(String[] args) {
        new A();
    }
}
Run Code Online (Sandbox Code Playgroud)

编译这些类,然后通过在命令中指定标志(默认启用类日志)来执行在其方法中Test创建实例的类:Amain()-verbosejava

java -verbose Test
Run Code Online (Sandbox Code Playgroud)

您应该在输出标准中看到类似以下内容:

[从 C:\... 加载 java.lang.Object]
[从 C:\... 加载 java.io.Serializable]
... // 加载所需的所有类,直到加载 C、B 和 A 类
[从文件加载 C:/C:/...]
[从文件加载B:/C:/...]
[从文件加载A:/C:/...]
C 构造函数
B 构造函数
构造函数

它证实:

  • 需要首先加载父类,从根父类(Object)开始,直到最接近的父类(B)。
  • 在加载层次结构的所有类之前不执行构造函数
  • 父类的构造函数始终在实例化类的构造函数之前执行,从根父构造函数 ( Object) 开始,直到最接近的父构造函数 ( B)。