本帖最后由 夏诗瑶 于 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变量
|