资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
Java 对象创建过程 (涉及到组合和继承的情况下)- 成员初始化顺序 对 Java 对象的创建过程、成员初始化顺序(尤其是涉及到组合和继承的情况下)作一下梳理总结。 java 编程思想书中第 4 章初始化与清理中对 Java 对象的创建过程总结如下: 假设有个名为 Dog 的类 当首次创建型为 Dog 的对象时(构造器可以看成静态方法),或者 Dog 类的静态方法/静态域首次被访问时,Java 解释器必须查找类路径,以定位 Dog.class 文件。 然后载入 Dog.class(这将创建一个 Class 对象),有关静态初始化的动作都会执行。因此,静态初始化只在 Class 对象首次加载的时候进行一次。 当你用 new Dog()创建对象的时候,首先将在堆上为 Dog 对象分配足够的存储空间。 这块存储空间会被清零,这就自动地将 Dog 中的所有基本类型数据设置成了默认值(对数字来说就是 0,对布尔型和字符型也相同),而引用则被置成了 null。 执行所有出现于域定义处的初始化动作。 执行构造器。 没有涉及到继承的时候,这个过程描述已经很清晰了,那么如果涉及到继承呢,看下面一段示例代码: Java 代码Java 代码 / Mouse4j.java package com.mouse4j.simpletest; / 静态字段类 class StaticField private 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; System.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) 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(); 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 static 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 写道 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 Mouse4j Characteristic Creating Description Mouse4j Description Mouse4j() 从程序输出可以看出: 当首次创建型为 Mouse4j 的对象时, Java 解释器查找类路径,定位 Mouse4j.class 文件。Java 解释器会根据 Mouse4j.class 定位其基类 Mouse.class、再根据 Mouse.class 定位到基类 Animal.class 文件,有关静态初始化的动作从基类到子类依次执行。 当你用 new Mouse4j()创建对象的时候,首先将在堆上为 Mouse4j 对象(包括其基类Mouse 和 Animal 中的域)分配足够的存储空间。 这块存储空间会被清零,这就自动地将 Mouse4j 中的所有基本类型数据(包括其基类Mouse 和 Animal 中的)设置成了默认值(对数字来说就是 0,对布尔型和字符型也相同),而引用(包括其基类 Mouse 和 Animal 中的)则被置成了 null。 执行基类 Animal 中所有出现于域定义处的初始化动作。 执行基类 Animal 构造器。 执行基类 Mouse 中所有出现于域定义处的初始化动作。 执行基类 Mouse 构造器。 执行子类 Mouse4j 中所有出现于域定义处的初始化动作。 执行子类 Mouse4j 构造器。 第 510 步过程总结如下: 在为所创建对象的存储空间清零后,找到继承链中最上层的基类, 执行 a、b 两步: a.执行其出现在域定义处的初始化动作 b.然后再执行其构造器 然后从基类到子类依次执行这两步操作。 到这里,涉及到继承 Java 对象创建过程和成员初始化顺序就理清楚了(编程思想中关于这一点的描述让我有点晕还是用程序实践一下思路会比较清晰) 再看组合的情况,将程序代码中的注释 1 和注释 2 去掉,考虑用于组合的类 Description中也包含 static 字段和在域定义处初始化的情况,程序执行结果如下: Console 写道 Java 代码 I am static field Animal I 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 对象的例子一致
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号