![](/img/trans.png)
[英]how can super refer to parent class object when we create a child class object?
[英]will there be object creation of parent class if we create an object of child class?
我知道每次创建子类对象时都会调用super。 但是,我特别想知道的是它会加载类还是会创建该父类的对象。
提前致谢。
你有一个对象。
在实例化类时,它首先调用父类的构造函数。 对于每个父类,它遵循相同的逻辑:它首先调用父类的构造函数。
假设: 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();
}
}
编译这些类,然后通过在java
命令中指定-verbose
标志(默认情况下启用类日志)来执行在其main()
方法中创建A
实例的Test
类:
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
)。 调用构造函数,因此创建父类的对象。 稍后使用该对象来构建子类的对象。 这样做的原因是子类的对象是父类的对象,具有更多的东西。
因为子类从父类继承属性和方法,所以加载了整个类层次结构(包括超类和实现的接口)。
当您创建childclass的一个实例,只有类型childclass的一个对象被创建(实例化)。 没有任何父母的额外实例。
在父类上声明的属性和方法可以通过子类实例访问,并且由于这种继承,子类实例将被接受为任何期望父实例(或它或任何父实现的任何接口)的方法的参数。
如果您将代码视为合同设计 ,那么这非常有意义:
extends
或implements
),可以保证子项也将自动提供相同的方法。 当您第一次加载一个类时,它的所有祖先也会以递归方式加载。
实例化对象时,不会实例化其父对象的其他实例。 但是,您刚刚实例化的对象本身也是父实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.