黑马程序员技术交流社区

标题: 关于构造函数的执行过程 [打印本页]

作者: 张淼    时间: 2012-9-18 23:14
标题: 关于构造函数的执行过程
运行以下代码片段,输出结果是?(  )
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在什么时候初始化,以及整个的初始化过程是怎样的?
作者: 杜佳瑞    时间: 2012-9-18 23:50
           1,执行父类中得static代码块,static成员变量初始化,这两个static代码按顺序执行,然后再执行子类的static代码块和static成员变量。

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

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

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

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


作者: 夏天    时间: 2012-9-18 23:59
好题!!
作者: 高照    时间: 2012-9-19 00:00
在java类中先初始化的是全局成员变量,静态成员优先于非静态成员
再执行构造函数,其中父类的构造函数优先于子类的构造函数
作者: 夏天    时间: 2012-9-19 00:07
本帖最后由 夏诗瑶 于 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变量

作者: 张淼    时间: 2012-9-19 23:41
夏诗瑶 发表于 2012-9-19 00:07
1.因为new用到了Z,并且子类继承了父类。所以会先找到父类X.class,再找到Z.class文件并加载到内存中。
2. ...

非常感谢,相当给力的回复。
作者: 夏天    时间: 2012-9-19 23:51
张淼 发表于 2012-9-19 23:41
非常感谢,相当给力的回复。

你问的选择题那个,已经给你回复了。看明白就行,别纠结大家为什么选不一样的




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