您的位置:首页 > 编程语言 > Java开发

JAVA编程思想学习 --- 第四章 (初始化和清除)

2017-09-06 18:04 330 查看
1.用构建器自动初始化
     对于方法的创建,可将其想象成为自己写的每个类都调用一次 initialize()。这个名字提醒我们在使用对象 之前,应首先进行这样的调用。但不幸的是,这也意味着用户必须记住调用方法。在 Java 中,由于提供了名 为“构建器”的一种特殊方法,所以类的设计者可担保每个对象都会得到正确的初始化。若某个类有一个构
建器,那么在创建对象时, Java 会自动调用那个构建器
—— 甚至在用户毫不知觉的情况下。所以说这是可以 担保的!
     接着的一个问题是如何命名这个方法。存在两方面的问题。第一个是我们使用的任何名字都可能与打算为某 个类成员使用的名字冲突第二是由于编译器的责任是调用构建器,所以它必须知道要调用是哪个方法。 C++ 采取的方案看来是最简单的,且更有逻辑性,所以也在 Java 里得到了应用:构建器的名字与类名相同。 这样 一来,可保证象这样的一个方法会在初始化期间自动调用。
     请注意所有方法首字母小写的编码规则并不适用于构建器。这是由于构建器的名字必须与类名完全相同! 和其他任何方法一样,构建器也能使用自变量,以便我们指定对象的具体创建方式。
     构建器属于一种较特殊的方法类型,因为它没有返回值。这与 void 返回值存在着明显的区别。对于 void 返 回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西。构建器则不同,它不仅什么也不 会自动返回,而且根本不能有任何选择。若存在一个返回值,而且假设我们可以自行选择返回内容,那么编 译器多少要知道如何对那个返回值作什么样的处理。

2.成员初始化
     若将基本类型(主类型)设为一个类的数据成员,情况就会变得稍微有些不同。由于任何方法都可以 初始化或使用那个数据,所以在正式使用数据前,若还是强迫程序员将其初始化成一个适当的值,就可能不 是一种实际的做法。然而,若为其赋予一个垃圾值,同样是非常不安全的。因此,一个类的所有基本类型数 据成员都会保证获得一个初始值。
     在一个类的内部定义一个对象句柄时,如果不将其初始化成新对象,那个句柄就会获得 一个空值



3.初始化顺序
     在一个类里,初始化的顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间, 那些变量仍会在调用任何方法之前得到初始化—— 甚至在构建器调用之前。
     初始化的顺序是首先 static(如果它们尚未由前一次对象创建过程初始化),接着是非static 对象。大家 可从输出结果中找到相应的证据。
在这里有必要总结一下对象的创建过程。请考虑一个名为 Dog 的类:
     (1) 类型为 Dog 的一个对象首次创建时,或者 Dog 类的 static 方法/ static 字段首次访问时,
Java 解释器 必须找到 Dog.class
(在事先设好的类路径里搜索)。
     (2) 找到 Dog.class 后(它会创建一个 Class 对象,这将在后面学到),它的所有 static 初始化模块都会运 行。因此,
static 初始化仅发生一次—— 在 Class 对象首次载入的时候。
     (3) 创建一个 new Dog()时, Dog 对象的构建进程首先会在内存堆( Heap)里为一个 Dog 对象分配足够多的存 储空间。
     (4) 这种存储空间会清为零,将 Dog 中的所有基本类型设为它们的默认值(零用于数字,以及 boolean 和 char 的等价设定)。
     (5) 进行字段定义时发生的所有初始化都会执行。
     (6) 执行构建器。正如第 6 章将要讲到的那样,这实际可能要求进行相当多的操作,特别是在涉及继承的时 候

 4.静态数据的初始化 
     若数据是静态的( static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其 初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对 象,并将句柄同它连接起来,否则就会得到一个空值( NULL)。 如果想在定义的同时进行初始化,采取的方法与非静态值表面看起来是相同的。但由于static 值只有一个存
储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。
     Java 允许我们将其他 static 初始化工作划分到类内一个特殊的“
static 构建从句”(有时也叫作“静态 块”)里
。它看起来象下面这个样子:
class Spoon {
     static int i;
     static {
          i = 47;
          }
     // . . .
     尽管看起来象个方法,但它实际只是一个 static 关键字,后面跟随一个方法主体与其他 static 初始化一 样,这段代码仅执行一次—— 首次生成那个类的一个对象时,或者首次访问属于那个类的一个 static 成员时 (即便从未生成过那个类的对象)。

5.数组的初始化 
     数组代表一系列对象或者基本数据类型,所有相同的类型都封装到一起—— 采用一个统一的标识符名称。数 组的定义和使用是通过方括号索引运算符进行的( [])。为定义一个数组,只需在类型名后简单地跟随一对 空方括号即可:
     int[] al;
     编译器不允许我们告诉它一个数组有多大。这样便使我们回到了“句柄”的问题上。此时,我们拥有的一切 就是指向数组的一个句柄,而且尚未给数组分配任何空间。为了给数组创建相应的存储空间,必须编写一个 初始化表达式。对于数组,初始化工作可在代码的任何地方出现,但也可以使用一种特殊的初始化表达式, 它必须在数组创建的地方出现。这种特殊的初始化是一系列由花括号封闭起来的值。存储空间的分配(等价
于使用 new)将由编译器在这种情况下进行。

     由于数组的大小是随机决定的(使用早先定义的pRand()方法),所以非常明显,数组的创建实际是在运行 期间进行的。

最近在看JAVA编程思想(第四版)这本书,将书中的一些知识点容易遇到或者混淆的概念记录下来,只是作为备忘,希望也能帮到需要的人,特此申明.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: