`
chamwarren
  • 浏览: 12243 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

初始化过程(Think in java 错误)

    博客分类:
  • java
阅读更多
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 章中看到的,这可能会牵涉到很多动作,尤其是涉及继承

的时候。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 26.6 KB
分享到:
评论

相关推荐

    think in java source code

    《Think in Java》是Bruce Eckel的经典编程教材,它深入浅出地讲解了Java语言的基础概念和高级特性。源码整理则为读者提供了实践和学习的机会,帮助理解书中的示例和理论。以下是对《Think in Java》源码中一些重要...

    Think in JAVA 编程思想 第四版 清晰扫描版

    6. **类与对象的创建**:构造函数用于初始化新创建的对象,析构函数在对象销毁前执行,理解这两者的使用有助于保证对象状态的正确性。 7. **接口与抽象类**:接口是完全抽象的,定义了行为规范,而抽象类部分实现,...

    Think in java学习笔记

    ### Think in Java 学习笔记知识点总结 #### 第1章:对象导论 - **一切皆为对象**:Java 中的几乎所有事物都是对象,对象通过发送消息的方式进行交互。 - **对象模型**:每个对象都有自己的存储空间,该空间由其他...

    think in java(直接就可以打印)

    此外,还讨论了成员初始化的细节,如自动成员初始化、指定成员初始化、初始化顺序和static初始化。 第5章“隐藏实现过程”主要讨论封装和访问控制,包括package和import关键字用于组织和导入类,以及public、...

    java编程思想练习答案 the think in Java Annotated Solution Guide

    在解答中,你将看到如何声明、初始化和使用这些基本元素。 2. **类与对象**:Java中的所有事物都被视为对象,类是创建对象的蓝图。书中会涉及类的定义、构造函数、成员变量和方法、访问修饰符(public、private、...

    Think in Java(中文版)chm格式

    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 内部类可以覆盖吗? ...

    Think in c#

    这一部分介绍了对象从创建到销毁的整个过程,包括初始化、清理等阶段。 - **集合与迭代器** 集合是一组数据项的容器,而迭代器则是遍历这些数据项的工具。C# 提供了丰富的集合类库和支持机制。 - **单根层次...

    thinkinjava源码-Thinking-in-Java:ThinkingInJava源代码和练习题

    初始化与清理(18年6月) 第6章 访问权限控制(18年6月) 第7章 复用类(18年6月) 第8章 多态(18年7月) 第9章 接口(18年10月) 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第14章 类型信息 第...

    Think in C# .Net

    5. **第 5 章:Initialization & Cleanup** —— 阐述了对象初始化和清理的相关知识,包括构造函数、析构函数等。 6. **第 6 章:Coupling and Cohesion** —— 分析了模块之间的耦合性和内聚性,解释了良好的软件...

    think in c#.pdf

    - **核心概念**:探讨对象生命周期管理的重要性,包括初始化和清理过程中的最佳实践。 6. **第 6 章:耦合与内聚** - **耦合与内聚**:解释这两个概念对于软件设计的重要性,并提供实现良好耦合与内聚的方法。 -...

    think in C sharp

    根据提供的信息,我们可以总结出以下关于《Think in C#》这本书的关键知识点: ### 一、书籍概述 **《Think in C#》**是一本由Larry O’Brien和Bruce Eckel共同编写的C#编程指南,旨在帮助读者理解面向对象编程的...

    恒生电子JAVA笔试试题-Thinking-In-Java-Notes:ThinkinginJava学习笔记

    初始化与清理 访问权限控制 复用类 多态 接口 内部类 持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java I/O系统 枚举类型 注解 并发 图形化用户界面 目标重点学习章节 5#初始化与清理 8#多态...

    Thinc in C

    《Thinc in C》是为那些想要深入理解C语言编程的初学者或有一定基础的程序员设计的一门课程,由著名编程书籍《Think in Java》和《Think in C++》的作者亲自编著并讲解。这门课程的目标是帮助学习者建立起扎实的...

    C++学习经验

    * C++有拷贝构造函数、初始化列表、模板、RTTI等特性。 * 需要了解为什么C++设计成这样的原因。 四、学习C++的方法 * 通过实践操作和看书来学习C++。 * 多问“为什么要这样”的问题。 * 学习C++需要长期的实践和...

    C#编程思想pdf版

    Bruce Eckel是著名的计算机科学家,以其撰写的“Think in”系列而闻名于世,其中包括《Think in Java》、《Think in C++》、《Think in Python》等多部编程著作。这些书籍深受程序员喜爱,并获得了广泛的好评。 ###...

    二十三种设计模式【PDF版】

    在浏览《Thingking in Java》(第一版)时,你是不是觉得好象这还是一本 Java 基础语言书籍?但又不纯粹是,因为这本书的作 者将面向对象的思想巧妙的融合在 Java 的具体技术上,潜移默化的让你感觉到了一种新的语言...

Global site tag (gtag.js) - Google Analytics