class X {
Y b;
public X() {
b = new Y();
System.out.println("X");
}
}
class Y {
public Y() {
System.out.println("Y");
}
}
public class Z extends X {
Y y;
public Z() {
y = new Y();
System.out.println("Z");
}
public static void main(String[] args) throws Exception {
new Z();
}
}
new Z() 之后,调用 Z 的无参构造函数;
因为 Z 继承了 X ,所以去调用 X 的无参构造函数(执行 super() );
X 的无参构造函数第一行代码为 Y b = new Y(),所以去调用 Y 的无参构造函数,此时输出 Y;
首先,你的代码和下面代码是等价的:
new Z()之后,调用Z的无参构造函数;因为
Z继承了X,所以去调用X的无参构造函数(执行super());X的无参构造函数第一行代码为Y b = new Y(),所以去调用Y的无参构造函数,此时输出 Y;Y b = new Y()执行完毕之后,回到X的无参构造函数,输出 X;然后回到
Z的无参构造函数,执行Y y = new Y()输出 Y,最后输出 Z。所以图中提到的 先执行 X 的构造函数 的说法是错误的,应该最先执行的是 Y 的构造函数。
函数的声明 void可以省略?
运行结果是
YXYZ,有什么不对吗?http://www.cnblogs.com/liulin...
这个很不错,希望这个能帮到你。
有什么问题可以评论。
继承与初始化分为三步 (p273):
顺序: