Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序

上传人:宝路 文档编号:7209624 上传时间:2017-09-18 格式:DOC 页数:8 大小:48KB
返回 下载 相关 举报
Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序_第1页
第1页 / 共8页
Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序_第2页
第2页 / 共8页
Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序_第3页
第3页 / 共8页
Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序_第4页
第4页 / 共8页
Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序》由会员分享,可在线阅读,更多相关《Java对象创建过程(涉及到组合和继承的情况下)-成员初始化顺序(8页珍藏版)》请在金锄头文库上搜索。

1、Java 对象创建过程 (涉及到组合和继承的情况下)- 成员初始化顺序 对 Java 对象的创建过程、成员初始化顺序(尤其是涉及到组合和继承的情况下)作一下梳理总结。 java 编程思想书中第 4 章初始化与清理中对 Java 对象的创建过程总结如下: 假设有个名为 Dog 的类 当首次创建型为 Dog 的对象时(构造器可以看成静态方法),或者 Dog 类的静态方法/静态域首次被访问时,Java 解释器必须查找类路径,以定位 Dog.class 文件。 然后载入 Dog.class(这将创建一个 Class 对象),有关静态初始化的动作都会执行。因此,静态初始化只在 Class 对象首次加载的

2、时候进行一次。 当你用 new Dog()创建对象的时候,首先将在堆上为 Dog 对象分配足够的存储空间。 这块存储空间会被清零,这就自动地将 Dog 中的所有基本类型数据设置成了默认值(对数字来说就是 0,对布尔型和字符型也相同),而引用则被置成了 null。 执行所有出现于域定义处的初始化动作。 执行构造器。 没有涉及到继承的时候,这个过程描述已经很清晰了,那么如果涉及到继承呢,看下面一段示例代码: Java 代码Java 代码 / Mouse4j.java package com.mouse4j.simpletest; / 静态字段类 class StaticField private

3、String s; StaticField(String s) this.s = s; System.out.println(I am static field + s); / 与静态字段相对的普通字段 class NormalField private String s; NormalField(String s) this.s= s; System.out.println(I am mormal field + s); / 特点类 class Characteristic private String s; Characteristic(String s) this.s = s; Syst

4、em.out.println(Creating Characteristic + s); / 描述类 class Description / 注释 1:在此例中如果用于组合的类中也包含 static 字段 / public static StaticField dStr = new StaticField(Description); / 注释 2:在此例中如果用于组合的类中也包含在域定义处初始化 / private NormalField dStr1 = new NormalField(Description); private String s; Description(String s)

5、this.s = s; System.out.println(Creating Description + s); class Animal public static StaticField AnimalStr = new StaticField(Animal); private Characteristic c = new Characteristic(Animal Characteristic); private Description d = new Description(Animal Description); Animal() System.out.println(Animal(

6、); class Mouse extends Animal public static StaticField MouseStr = new StaticField(Mouse); private Characteristic c = new Characteristic(Mouse Characteristic); private Description d = new Description(Mouse Description); Mouse() System.out.println(Mouse(); public class Mouse4j extends Mouse public st

7、atic StaticField Mouse4jStr = new StaticField(Mouse4j); private Characteristic c = new Characteristic(Mouse4j Characteristic); private Description d = new Description(Mouse4j Description); Mouse4j() System.out.println(Mouse4j(); public static void main(String args) new Mouse4j(); 程序执行输出如下: Console 写

8、道 Java 代码 I am static field Animal I am static field Mouse I am static field Mouse4j Creating Characteristic Animal Characteristic Creating Description Animal Description Animal() Creating Characteristic Mouse Characteristic Creating Description Mouse Description Mouse() Creating Characteristic Mous

9、e4j Characteristic Creating Description Mouse4j Description Mouse4j() 从程序输出可以看出: 当首次创建型为 Mouse4j 的对象时, Java 解释器查找类路径,定位 Mouse4j.class 文件。Java 解释器会根据 Mouse4j.class 定位其基类 Mouse.class、再根据 Mouse.class 定位到基类 Animal.class 文件,有关静态初始化的动作从基类到子类依次执行。 当你用 new Mouse4j()创建对象的时候,首先将在堆上为 Mouse4j 对象(包括其基类Mouse 和 An

10、imal 中的域)分配足够的存储空间。 这块存储空间会被清零,这就自动地将 Mouse4j 中的所有基本类型数据(包括其基类Mouse 和 Animal 中的)设置成了默认值(对数字来说就是 0,对布尔型和字符型也相同),而引用(包括其基类 Mouse 和 Animal 中的)则被置成了 null。 执行基类 Animal 中所有出现于域定义处的初始化动作。 执行基类 Animal 构造器。 执行基类 Mouse 中所有出现于域定义处的初始化动作。 执行基类 Mouse 构造器。 执行子类 Mouse4j 中所有出现于域定义处的初始化动作。 执行子类 Mouse4j 构造器。 第 510 步过

11、程总结如下: 在为所创建对象的存储空间清零后,找到继承链中最上层的基类, 执行 a、b 两步: a.执行其出现在域定义处的初始化动作 b.然后再执行其构造器 然后从基类到子类依次执行这两步操作。 到这里,涉及到继承 Java 对象创建过程和成员初始化顺序就理清楚了(编程思想中关于这一点的描述让我有点晕还是用程序实践一下思路会比较清晰) 再看组合的情况,将程序代码中的注释 1 和注释 2 去掉,考虑用于组合的类 Description中也包含 static 字段和在域定义处初始化的情况,程序执行结果如下: Console 写道 Java 代码 I am static field Animal I

12、 am static field Mouse I am static field Mouse4j Creating Characteristic Animal Characteristic I am static field Description I am mormal field Description Creating Description Animal Description Animal() Creating Characteristic Mouse Characteristic I am mormal field Description Creating Description Mouse Description Mouse() Creating Characteristic Mouse4j Characteristic I am mormal field Description Creating Description Mouse4j Description Mouse4j() 可见 Description 对象的创建过程与成员初始化顺序与本文开头的 Dog 对象的例子一致

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号