黑马程序员技术交流社区

标题: 为什么输出结果是YXYZ,而不是YYXZ,对象初始化过程问题。 [打印本页]

作者: 18643448863    时间: 2014-10-6 09:06
标题: 为什么输出结果是YXYZ,而不是YYXZ,对象初始化过程问题。
本帖最后由 18643448863 于 2014-10-9 07:28 编辑
  1. class X {
  2.         Y b = new Y();
  3.         X() {
  4.                         System.out.print("X");
  5.         }
  6. }

  7. class Y {
  8.         Y() {
  9.                         System.out.print("Y");
  10.         }
  11. }

  12. public class Z extends X {
  13.         
  14.         Y y = new Y();
  15.         Z() {
  16.                         System.out.print("Z");
  17.         }

  18.         public static void main(String[] args) {
  19.                         new Z();
  20.         }
  21. }
复制代码

我的理解 首先是默认初始化 都为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