你只有一个对象。
当类被实例化时,它首先调用父类的构造函数。对于每个父类,它遵循相同的逻辑:它首先调用父类的构造函数。
假设: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)。| 归档时间: |
|
| 查看次数: |
5422 次 |
| 最近记录: |