class Bowl { Bowl(int marker) { System.out.println("Bowl(" + marker + ")"); } void f(int marker) { System.out.println("f(" + marker + ")"); } } class Table { static Bowl b1 = new Bowl(1); Table() { System.out.println("Table()"); b2.f(1); } void f2(int marker) { System.out.println("f2(" + marker + ")"); } static Bowl b2 = new Bowl(2); } class Cupboard { Bowl b3 = new Bowl(3); static Bowl b4 = new Bowl(4); Cupboard() { System.out.println("Cupboard()"); b4.f(2); } void f3(int marker) { System.out.println("f3(" + marker + ")"); } static Bowl b5 = new Bowl(5); } public class OrderOfInitialization { public static void main(String[] args) { System.out.println("Creating new Cupboard() in main"); new Cupboard(); System.out.println("Creating new Cupboard() in main"); new Cupboard(); } } "Bowl(1)", "Bowl(2)", "Table()", "f(1)", "Bowl(4)", "Bowl(5)", "Bowl(3)", "Cupboard()", "f(2)", "Creating new Cupboard() in main", "Bowl(3)", "Cupboard()", "f(2)", "Creating new Cupboard() in main", "Bowl(3)", "Cupboard()", "f(2)", "f2(1)", "f3(1)"
第一段和第二段共有 5 处错误(第三版的这里就是错误的,详见原著,很明显):此下两段中红色的为错误。Bowl 类使你得以看到类的创建, Table 类和 Cupboard 类在它们的类定义中加入了而Bowl 类型的静态成员。
注意,在静态数据成员定义之前,Cupboard 类先定义了一个 Bowl 类型的非静态成员 b3。由输出可见,静态初始化只有在必要时刻才会进行。如果不创建 Table 对象,也不引用 Table.b1 或 Table.b2,那么静 态的 Bowl b1 和 b2 永远都不会被创建。只有在第一个 Table对象被创建(或者第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。更正为:Bowl 类使你得以看到类的创建, Table 类和 Cupboard 类在它们的类定义中加入了而Bowl 类型的静态成员。注意,在静态数据成员定义之前,Cupboard 类先定义了一个 Bowl 类型的非静态成员 bowl3。由输出可见,静态初始化只有在必要时刻才会进行。如果不创建 Table 对象,也不引用 Table.bow1 或 Table.bow2,那么静态的 Bowl bow1 和 bow2 永远都不会被创建。只有在第一个 Table 对象被创建(或者第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。
Creating new Cupboard() in main Bowl(4) Bowl(5) Bowl(3) Cupboard() f(2) Creating new Cupboard() in main Bowl(3) Cupboard() f(2)
总结一下对象的创建过程会很有帮助。假设有个名为 Dog 的类:
1. 当首次创建类型为 Dog 的对象时(构造器可以看成静态方法),或者 Dog 类的静态方法/静态域首次被访问时,Java 解释器必须查找类路径,以定位 Dog.class 文件。
2. 然后载入 Dog.class(后面会学到,这将创建一个 Class 对象),有关静态初始化的动作都会执行。因此,静态初始化只在 Class 对象首次加载的时候进行一次。
3. 当你用 new Dog( )创建对象的时候,首先将在堆上为 Dog 对象分配足够的存储空间。
4. 这块存储空间会被清零,这就自动地将 Dog 中的所有基本类型数据设置成了默认值(对数字来说就是 0,对布尔型和字符型也相同),而引用则被设置成了 null。
5. 执行所有出现于域定义处的初始化动作。
6. 执行构造器。正如你将在第 6 章中看到的,这可能会牵涉到很多动作,尤其是涉及继承
的时候。
相关推荐
《Think in Java》是Bruce Eckel的经典编程教材,它深入浅出地讲解了Java语言的基础概念和高级特性。源码整理则为读者提供了实践和学习的机会,帮助理解书中的示例和理论。以下是对《Think in Java》源码中一些重要...
6. **类与对象的创建**:构造函数用于初始化新创建的对象,析构函数在对象销毁前执行,理解这两者的使用有助于保证对象状态的正确性。 7. **接口与抽象类**:接口是完全抽象的,定义了行为规范,而抽象类部分实现,...
### Think in Java 学习笔记知识点总结 #### 第1章:对象导论 - **一切皆为对象**:Java 中的几乎所有事物都是对象,对象通过发送消息的方式进行交互。 - **对象模型**:每个对象都有自己的存储空间,该空间由其他...
此外,还讨论了成员初始化的细节,如自动成员初始化、指定成员初始化、初始化顺序和static初始化。 第5章“隐藏实现过程”主要讨论封装和访问控制,包括package和import关键字用于组织和导入类,以及public、...
在解答中,你将看到如何声明、初始化和使用这些基本元素。 2. **类与对象**:Java中的所有事物都被视为对象,类是创建对象的蓝图。书中会涉及类的定义、构造函数、成员变量和方法、访问修饰符(public、private、...
7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? ...
这一部分介绍了对象从创建到销毁的整个过程,包括初始化、清理等阶段。 - **集合与迭代器** 集合是一组数据项的容器,而迭代器则是遍历这些数据项的工具。C# 提供了丰富的集合类库和支持机制。 - **单根层次...
初始化与清理(18年6月) 第6章 访问权限控制(18年6月) 第7章 复用类(18年6月) 第8章 多态(18年7月) 第9章 接口(18年10月) 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第14章 类型信息 第...
5. **第 5 章:Initialization & Cleanup** —— 阐述了对象初始化和清理的相关知识,包括构造函数、析构函数等。 6. **第 6 章:Coupling and Cohesion** —— 分析了模块之间的耦合性和内聚性,解释了良好的软件...
- **核心概念**:探讨对象生命周期管理的重要性,包括初始化和清理过程中的最佳实践。 6. **第 6 章:耦合与内聚** - **耦合与内聚**:解释这两个概念对于软件设计的重要性,并提供实现良好耦合与内聚的方法。 -...
根据提供的信息,我们可以总结出以下关于《Think in C#》这本书的关键知识点: ### 一、书籍概述 **《Think in C#》**是一本由Larry O’Brien和Bruce Eckel共同编写的C#编程指南,旨在帮助读者理解面向对象编程的...
初始化与清理 访问权限控制 复用类 多态 接口 内部类 持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java I/O系统 枚举类型 注解 并发 图形化用户界面 目标重点学习章节 5#初始化与清理 8#多态...
《Thinc in C》是为那些想要深入理解C语言编程的初学者或有一定基础的程序员设计的一门课程,由著名编程书籍《Think in Java》和《Think in C++》的作者亲自编著并讲解。这门课程的目标是帮助学习者建立起扎实的...
* C++有拷贝构造函数、初始化列表、模板、RTTI等特性。 * 需要了解为什么C++设计成这样的原因。 四、学习C++的方法 * 通过实践操作和看书来学习C++。 * 多问“为什么要这样”的问题。 * 学习C++需要长期的实践和...
Bruce Eckel是著名的计算机科学家,以其撰写的“Think in”系列而闻名于世,其中包括《Think in Java》、《Think in C++》、《Think in Python》等多部编程著作。这些书籍深受程序员喜爱,并获得了广泛的好评。 ###...
在浏览《Thingking in Java》(第一版)时,你是不是觉得好象这还是一本 Java 基础语言书籍?但又不纯粹是,因为这本书的作 者将面向对象的思想巧妙的融合在 Java 的具体技术上,潜移默化的让你感觉到了一种新的语言...