标题: 关于子类继承父类访问先后顺序,求详解(前提是你真懂) [打印本页] 作者: 乔玉吉 时间: 2012-6-27 17:44 标题: 关于子类继承父类访问先后顺序,求详解(前提是你真懂) 运行以下代码片段,输出结果是?( )
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();
}
} 作者: 车风波 时间: 2012-6-27 18:11
类中:先成员变量默认初始化,然后执行构造方法,最后成员变量显式初始化。
首先你运行Z,在此类中先显式初始化y Y y = new Y();然后执行main().
main()中执行的new Z();会先执行父类的构造函数
X() {
System.out.print("X");
}
,然后显式初始化父类的成员变量Y b = new Y();
最后执行子类的构造函数
Z() {
System.out.print("Z");
}作者: 晁喆 时间: 2012-6-27 18:19 本帖最后由 晁喆 于 2012-6-27 18:35 编辑
首先访问main函数,new Z()的意思是:创建子类对象的时候, 内部会先创建一个父类对象,所以先执行class x{}中的代码,输出YX,再回来执行继承的代码,输出YZ。
结果应该是:YXYZ作者: 马林康 时间: 2012-6-27 18:31
对象初始化顺序:父类静态成员变量<父类静态初始化块<子类静态成员变量<子类静态初始化块<父类变量<父类初始化块<父类构造器<子类变量<子类初始化块<子类构造器 结果为YXYZ作者: 李伟 时间: 2012-6-27 18:56
new Z();是先对父类X进行初始化,然后Z再初始化,父类X初始化之后是YX, Z初始化之后是YZ,所以结果是YXYZ作者: 孙飞 时间: 2012-6-27 21:24
class X {
Y b = new Y();
X() {
System.out.print("X");
}
}
是先执行Y b = new Y();
还是先执行构造函数?
那个Y b = new Y();不是一个显式初始化吗? 作者: 王德升 时间: 2012-6-27 21:54
feigecal 发表于 2012-6-27 21:24
class X {
Y b = new Y();
X() {