构造函数
构造函数名称和class名称相同。构造函数是一种很独特的函数,因为它没有返回值。这和“返回值为void”有极大的差别。返回void时,一般函数并不返回任何东西,但是一般的函数能够选择是否要返回些什么东西。构造函数则绝对不返回任何东西,而且也没有任何选择。
重载
如果多个函数具有相同名称,Java如何知道你要取用的究竟是哪一个呢?规则很简单:每个重载函数都需具备独一无二的引数列(argument list)。无法以返回型别作为重载函数的区分基准。
关键字 this
在某个函数之内,想取得当前的 object reference 时。由于该reference是编译器偷偷传入,所以并不存在其识别名称。为了这个原因,关键字 this 因应而生。这个关键字仅作用于函数之内,能取得“唤起此一函数”的那个 object reference 。可以采取面对任何 object reference 一样的处理方式来处理这个 this。如果只是在某个class的某个函数内调用同一个class的另一个函数,没有必要动用 this,直接调用即可,因为编译器会自动套用当前的 this reference。
正常情况下,this 指的是“此一对象”或“目前对象”,并自动产生“目前的对象”的reference。但是在构造函数中,当赋予 this 一个引用数列,它有了不同的意义:它会调用符合该引数列的某个构造函数。如此一来,我们便能够直接调用其它构造函数。
垃圾回收
垃圾回收动作只回收内存。也就是说,垃圾收集器存在的唯一理由,就是要回收那些在你程序中再也用不着的内存空间。所以任何和垃圾回收动作捆绑在一起的行为,也都只能和内存或内存的释放相关。
当垃圾回收器打算开始释放你的对象所占用的存储空间时,会先调用其finalize(),并且在下一次垃圾回收动作发生时才回收该对象所占用的空间。所以,finalize()有个可以发挥实际效用的地方,就是用来观察垃圾回收过程。由于Java对象都必须经过new产生,所以也就不需要自己来释放,从而finalize()并不是用来清理或释放内存空间的,并且不要让重要逻辑依赖这个函数的执行。
成员初始化
Java保证,变量绝对会在它们被使用之前被适当初始化。当变量定义在函数内部时,Java会运用编译期错误消息来贯彻它的保证。
如果某个class的数据成员隶属基本型别,情况就稍有不同。因为所有函数都可以初始化或使用该数据值,所以强迫使用者一定得在使用之前给定适当初值是不切实际的。不过,放任它持有毫无意义的初值也很危险,所以每个“隶属基本型别”的class数据成员都保证一定有初值。
构造函数可以用来执行初始化动作,但并不会消除发生于构造函数之前的自动初始化动作。任何基本型别和 object reference 都是如此,就连那些定义时便给定初值的变量也不例外。
class中的初始化次序取决于变量在class中的定义次序。变量定义也许会散落各处,而且有可能介于各个函数之间。但所有变量一定会在任何一个函数(甚至是构造函数)被调用之前完成初始化。
当数据是static型式,情况没有什么不同:如果数据隶属基本型别而又没有加以初始化,它便会被设为基本型别的标准初值;如果它是某个 object reference,初始值便是null,除非你产生新对象并将这个reference指向它。
static的初始化动作只在必要时刻才会发生,也就是在第一个static被访问之际。自此之后,static对象便不会再被初始化。如果static成员并未因为早先的对象生成过程而被初始化,那么初始化次序会以static为优先,然后才是non-static对象。
Array的初始化
int[] a1;
// 或者
int a1[];
此行代码执行之后,只拥有一个reference,代表某个array,但是并没有对应任何空间。如果想为该array产生必要的存储空间,就必须进行初始化才行。对array而言,初始化可以出现在程序的任何地点。
int[] a1 = {1, 2, 3, 4, 5};
int[] a;
a = new int[rand];
array的大小,不是一定要在编译期给定的,也可以在运行期再给定,但必须保证在使用时是有明确的大小的。
网友评论