黑马程序员技术交流社区
标题:
关于涉及到继承的构造函数调用
[打印本页]
作者:
a12366456
时间:
2015-7-20 00:07
标题:
关于涉及到继承的构造函数调用
本帖最后由 a12366456 于 2015-7-20 00:09 编辑
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();
}
}
复制代码
执行后结果为:YXYZ ,和我最开始想的结果不一样,我想象的实例化只执行了构造函数不包含上面的语句,明显错了。最后分析可能是Z继承了X,实例化Z的对象时,先隐式实例化父类X的对象,所以先执行了X类中Y的实例化语句打印Y,再执行X的构造函数X()打印X,接着回来实例化Z的对象,先执行Y的实例化语句
Y y = new Y();打印Y,再执行
Z的构造函数Z()打印Z。不知道对不对??
作者:
安卓新手
时间:
2015-7-20 09:02
我也觉得 结果不应该是 XZ吗? 不应该只执行构造方法?
作者:
耀阳圣尊
时间:
2015-7-20 09:13
这个结果,你可以打一个断点看看。这样效果更清楚。
作者:
a12366456
时间:
2015-7-20 14:31
安卓新手 发表于 2015-7-20 09:02
我也觉得 结果不应该是 XZ吗? 不应该只执行构造方法?
我觉得是我们想当然了,实例化一个类的对象时,哪怕我们调用的是空参空语句的默认构造函数,对于new这个动作,Java也要执行为类的成员变量和成员函数分配内存并初始化的动作,而且这个动作要在调用构造函数之前发生,因为在构造函数中已经可以使用这些成员。只不过这个动作已经被Java封装在底层。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2