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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张淼 中级黑马   /  2012-9-18 23:14  /  2187 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

运行以下代码片段,输出结果是?(  )
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
----------------------------------------------------------------------------------------------------------------------------------------
new Z();之后不是应该执行Z的父类的构造函数,输出X,然后执行Z的构造函数输出Z么?
那个Y在什么时候初始化,以及整个的初始化过程是怎样的?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
           1,执行父类中得static代码块,static成员变量初始化,这两个static代码按顺序执行,然后再执行子类的static代码块和static成员变量。

           2,父类中普通成员变量初始化(Y b = new Y();即先打印出Y)以及构造代码块执行,无优先级之分,顺序如同静态。

           3,最后执行父类中构造函数(执行X的构造函数,打印X),完毕后才向下执行子类。

           4,子类中普通成员变量(Y y = new Y();打印Z类中的Y)、代码块、构造函数(执行Z的构造函数打印Z)执行顺序同父类。

楼主掌握上面的执行过程这类题就没多大问题了

回复 使用道具 举报
好题!!
回复 使用道具 举报
在java类中先初始化的是全局成员变量,静态成员优先于非静态成员
再执行构造函数,其中父类的构造函数优先于子类的构造函数
回复 使用道具 举报
本帖最后由 夏诗瑶 于 2012-9-19 23:50 编辑

1.因为new用到了Z,并且子类继承了父类。所以会先找到父类X.class,再找到Z.class文件并加载到内存中。
2.在堆内存中开辟空间,分配内存地址
3.对 父类属性 进行初始化。也就是执行 Y b=new Y();//输出Y
4.运行父类构造函数//输出X
5.在堆内存中建立子类对象的特有属性,并进行初始化。也就是运行Y y = new Y();//输出Y
5.再执行子类构造函数//输出Z

另外分享下我的总结,看明白下面的初始化过程,所有关于对象创建先后顺序的题目一目了然
子类继承父类,子父类中都有 静态代码块(给类初始化用的,随着类的加载而加载),构造代码块(给对象初始化,优先于构造函数),带参构造函数。
   Zi p=new Zi("lisi",20);
   1、因为new用到了Zi.class,并且子类继承了父类。所以会先找到Fu.class,再找到Zi.class文件并加载到内存中
   2、执行 父类静态代码块
   3、执行子类静态代码块
   4、在堆内存中开辟空间,分配内存地址
   5、对 父类属性 默认初始化,显式初始化//默认初始化,既属性都有默认值,比如 int age=20;默认值就是0;显式初始化为20;
   6、父类构造代码块
   7、父类构造函数
   8、在堆内存中建立子类对象的特有属性,并进行默认初始化
   9、对子类属性显式初始化
   10、子类构造代码块
   11、子类构造函数
   12、将内存地址付给栈内存中的p变量

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
夏诗瑶 发表于 2012-9-19 00:07
1.因为new用到了Z,并且子类继承了父类。所以会先找到父类X.class,再找到Z.class文件并加载到内存中。
2. ...

非常感谢,相当给力的回复。
回复 使用道具 举报
夏天 初级黑马 2012-9-19 23:51:42
7#
张淼 发表于 2012-9-19 23:41
非常感谢,相当给力的回复。

你问的选择题那个,已经给你回复了。看明白就行,别纠结大家为什么选不一样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马