我知道每次创建子类对象都会调用super。但是,我特别想知道的是它会加载类还是会创建该父类的对象。
提前致谢。
最佳答案
您有一个单个对象。
当一个类被实例化时,它首先调用父类的构造函数。对于每个父类,它遵循相同的逻辑:它首先调用父类的构造函数。
假设:A
扩展B
扩展C
。
new A()
导致 B
构造函数调用,该构造函数自身调用 C
构造函数。
作为 C
然后返回 B
构造函数调用,A
构造函数可以继续并创建实例 A
。
But, what I specifically want to know is that will it load the class or will it create the object of that parent class.
类似于构造函数的执行,在加载一个类之前,必须首先
加载它的父类,然后递归地为每个父类加载。
这里对应于 A
extends B
extends 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();
}
}
编译这些类,然后执行 Test
类,该类通过指定 在其
标志(默认情况下启用类日志):main()
方法中创建一个 A
实例java
命令中的 -verbose
java -verbose Test
你应该在输出标准中看到如下内容:
[Loaded java.lang.Object from C:\...] [Loaded java.io.Serializable from C:\...] ... // load all classes required until loaded C, B and A classes [Loaded C from file:/C:/...] [Loaded B from file:/C:/...] [Loaded A from file:/C:/...] C constructor B constructor A constructor
它确认:
- 首先需要加载父类,从根父类(
Object
)开始,直到最近的父类(B
)。 - 在加载层次结构的所有类之前不执行构造函数
- 父类的构造函数总是在实例化类的构造函数之前执行,从根父构造函数(
Object
)开始,直到最近的父构造函数(B
) ).
关于java - 如果我们创建一个子类的对象,会不会有父类的对象创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49627652/