A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

运行以下代码片段,输出结果是?(  )
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();
        }
}

6 个回复

倒序浏览
类中:先成员变量默认初始化,然后执行构造方法,最后成员变量显式初始化。
首先你运行Z,在此类中先显式初始化y  Y y = new Y();然后执行main().
main()中执行的new Z();会先执行父类的构造函数
X() {
         System.out.print("X");
         }
,然后显式初始化父类的成员变量Y b = new Y();
最后执行子类的构造函数
Z() {
      System.out.print("Z");
        }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 晁喆 于 2012-6-27 18:35 编辑

首先访问main函数,new Z()的意思是:创建子类对象的时候, 内部会先创建一个父类对象,所以先执行class x{}中的代码,输出YX,再回来执行继承的代码,输出YZ。
结果应该是:YXYZ

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
对象初始化顺序:父类静态成员变量<父类静态初始化块<子类静态成员变量<子类静态初始化块<父类变量<父类初始化块<父类构造器<子类变量<子类初始化块<子类构造器 结果为YXYZ
回复 使用道具 举报
new Z();是先对父类X进行初始化,然后Z再初始化,父类X初始化之后是YX,  Z初始化之后是YZ,所以结果是YXYZ
回复 使用道具 举报
class X {
        Y b = new Y();
        X() {
                        System.out.print("X");
        }
}

是先执行Y b = new Y();
还是先执行构造函数?
那个Y b = new Y();不是一个显式初始化吗?
回复 使用道具 举报
feigecal 发表于 2012-6-27 21:24
class X {
        Y b = new Y();
        X() {

先执行x(){},在给对象初始化。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马