黑马程序员技术交流社区

标题: 这道题选什么,为什么? [打印本页]

作者: aohn1117    时间: 2015-11-22 23:38
标题: 这道题选什么,为什么?
20.运行以下代码片段,输出结果是?(  )
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();
        }
}
A. Z
B. YZ
C. XYZ
D. YXYZ
作者: 隔壁马良    时间: 2015-11-23 00:56
B?求解
作者: yuanjun52306    时间: 2015-11-26 23:51
C吧。子类继承父类,先调用父类的构造函数,所以先输出X
作者: Camwly    时间: 2015-11-27 09:04
运行出来是D不过不知道为什么
作者: Myth、骞    时间: 2015-11-27 11:12
解析:
       public class Z extends X {里面 的  Y y = new Y()的这一部分 称为 构造代码块,
     作用:给对象 进行初始化,
     所以 说,new 对象时,它会 执行,且 优先于构造函数,so:  第一个就是Y

   构造代码块与构造函数的区别:

   构造代码块:给所有对象统一初始化,
   构造函数:给对应的对象初始化,
作者: 黑夜中那颗星    时间: 2015-11-27 12:17
流程图

QQ截图20151127121646.jpg (125.44 KB, 下载次数: 3)

QQ截图20151127121646.jpg

作者: wyasln    时间: 2015-11-27 12:54
B吧,先执行Z类的初始化代码,再执行构造函数
作者: TG·小强    时间: 2015-11-27 13:15
Myth、骞 发表于 2015-11-27 11:12
解析:
       public class Z extends X {里面 的  Y y = new Y()的这一部分 称为 构造代码块,
     作用 ...

报纸楼的理解没有问题。我觉得它里面好像隐含了重写的功能。
Yy=new Y();与Y b=new Y();you有重写。
个人见解。求大神解释。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2