黑马程序员技术交流社区
标题:
为什么输出结果是YXYZ,而不是YYXZ,对象初始化过程问题。
[打印本页]
作者:
18643448863
时间:
2014-10-6 09:06
标题:
为什么输出结果是YXYZ,而不是YYXZ,对象初始化过程问题。
本帖最后由 18643448863 于 2014-10-9 07:28 编辑
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();
}
}
复制代码
我的理解 首先是默认初始化 都为NULL, 然后是显示初始化 都为Y ,之后是构造代码快初始化 因为 Z继承X 所以X先要对 x中的对象构造代码快初始化为X然后是子类的构造代码快初始化为Z ,我的这个思路输出应该是YYXZ,可是输出结果是YXYZ ,对于这个创建对象的初始化过程, 不知道我的思路哪里出了问题。
作者:
yueyazhishang
时间:
2014-10-6 09:25
可以自己打断点调试,真实的执行过程是:
1,初始化Z,会执行无参构造函数,因为Z继承X,所以初始化X
2,初始化X,在初始化X 之前会先初始化Y,所以先输出y
3,反过来执行X的无参构造函数,所以输出x
4,反过来,同样是先初始化Y,所以输出y
最后执行Z的无参构造函数,输出z;
作者:
kid1943
时间:
2014-10-6 09:38
类初始化的时候构造函数先执行,然后其中的成员变量才开始初始化
作者:
小漠
时间:
2014-10-6 10:14
看你还没明白,我就给你说说的的理解吧,(其实昨天2楼讲的很明白。。。)
首先更正一下你的表达,构造代码快不是构造函数
java内存的执行顺序是(静态属性、静态代码快)>(特有属性、构造代码快)>构造方法。(括号部分是谁在前谁先执行)
因此,此题就是new Z(),发现Z有父类,因为有一个默认的super(),所以就看X,先执行特有属性,和先后位置无关,①Y b = new Y();输出Y,
其次看构造函数②输出X,其次执行子类自己的特有属性和构造函数,依次是YZ。
为什么不是你理解的YYXZ,是因为要先执行完父类才会执行子类。
我昨天迷糊的地方是我跳着看视频,没有明白默认初始化和显示初始化。
希望你能明白点,如果不明白就记下来执行的顺序就OK了
1.父类:静态属性
2.父类:静态自由块
3.子类:静态属性
4.子类:静态自由块
5.子类main方法
6.父类:特有属性
7.父类:自由块
8.父类:构造方法
9.子类:特有属性
10.子类:自由块
11.子类:构造方法
作者:
x564573138
时间:
2014-10-6 13:04
沙发。。。。。。
作者:
笑脸迷人
时间:
2014-10-6 21:10
又学到了一点~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2