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;
发布评论
评论(6)
继承与初始化分为三步 (p273):
顺序:
首先,你的代码和下面代码是等价的:
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...
这个很不错,希望这个能帮到你。
有什么问题可以评论。