标题: 关于构造函数的执行过程 [打印本页] 作者: 张淼 时间: 2012-9-18 23:14 标题: 关于构造函数的执行过程 运行以下代码片段,输出结果是?( )
class X {
Y b = new Y();
X() {
System.out.print("X");
}
}
class Y {
Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y = new Y();
Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
A. Z
B. YZ
C. XYZ
D. YXYZ
----------------------------------------------------------------------------------------------------------------------------------------
new Z();之后不是应该执行Z的父类的构造函数,输出X,然后执行Z的构造函数输出Z么?
那个Y在什么时候初始化,以及整个的初始化过程是怎样的?作者: 杜佳瑞 时间: 2012-9-18 23:50
1,执行父类中得static代码块,static成员变量初始化,这两个static代码按顺序执行,然后再执行子类的static代码块和static成员变量。
2,父类中普通成员变量初始化(Y b = new Y();即先打印出Y)以及构造代码块执行,无优先级之分,顺序如同静态。
3,最后执行父类中构造函数(执行X的构造函数,打印X),完毕后才向下执行子类。
4,子类中普通成员变量(Y y = new Y();打印Z类中的Y)、代码块、构造函数(执行Z的构造函数打印Z)执行顺序同父类。
1.因为new用到了Z,并且子类继承了父类。所以会先找到父类X.class,再找到Z.class文件并加载到内存中。
2.在堆内存中开辟空间,分配内存地址
3.对 父类属性 进行初始化。也就是执行 Y b=new Y();//输出Y
4.运行父类构造函数//输出X
5.在堆内存中建立子类对象的特有属性,并进行初始化。也就是运行Y y = new Y();//输出Y
5.再执行子类构造函数//输出Z