我知道每次创建子类对象时都会调用super。但是,我特别想知道的是它会加载类还是会创建该父类的对象。
提前致谢。
答案 0 :(得分:2)
你有一个单个对象 在实例化类时,它会调用父类的构造函数 first 。对于每个父类,它遵循相同的逻辑:它调用第一个父类的构造函数。
假设:A
扩展B
扩展C
。
new A()
会导致调用B
构造函数的C
构造函数调用。
作为C
,然后返回B
构造函数调用,A
构造函数可以继续,并创建实例A
。
但是,我特别想知道的是它会加载课程 或者它会创建该父类的对象。
与构造函数执行类似,在加载类之前,必须为每个父类递归加载其父类first
。
此处与A
对应的类扩展B
扩展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
类,在A
方法中通过指定main()
标志创建-verbose
实例(默认情况下启用类日志)在java
命令中:
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
)。答案 1 :(得分:1)
调用构造函数,因此创建父类的对象。稍后使用该对象来构建子类的对象。原因是子类的对象是父类的对象,有更多的东西。
答案 2 :(得分:1)
因为子类从父类继承属性和方法,所以整个类层次结构(包括超类和已实现的接口)都已加载。
创建子类的实例时,只创建(实例化)类型为childclass的单个对象。没有任何父母的其他实例。
在父类上声明的属性和方法可以通过子类实例访问,并且由于这种继承,子类实例将被接受为任何期望父实例(或它或任何父实例的任何接口)的方法的参数器具)。
如果您认为代码是合同设计,那么这很有道理:
extends
或implements
)保证,孩子也会自动提供相同的方法。 答案 3 :(得分:0)
当您第一次加载一个类时,它的所有祖先也会以递归方式加载。
实例化对象时,不会实例化其父对象的其他实例。但是,您刚刚实例化的对象本身也是父实例。