你的位置:首页 > Java教程

[Java教程]Thinking in JAVA笔记——第五章 初始化与清理


5.1用构造器确保初始化

为了确保安全性,强制在使用前进行初始化

Java构造器与类名相同,无参数构造器又叫做默认构造器。

 

5.2 方法重载

method overloading:重载,同名不同参

method overriding:重写/覆盖,子类覆盖父类

5.2.1区分重载方法

独一无二的参数类型表,否则编译不通过!

5.2.2涉及基本类型的重载

如果参数类型是int,short,byte,long等,常数自动定位到int而不会执行short,byte

因为默认常数就是int型,如果没有int,则会依次向上转型到long,float,double

注意:向上转型不会丢信息,可以自动转型

   向下转型会丢失信息,必须强制类型转换

5.2.3以返回值区分重载方法

不允许。因为可能一个int型方法f()也可以直接调用而不做任何事情

 

5.3默认构造器

如果不写构造器,编译器会写一个无参数构造器,申请内存空间

 

5.4this关键字

发送消息给对象:编译器“偷偷”把调用方法的对象的引用最为参数传递给方法,所以方法知道是哪个对象在调用它,这个对象的属性值是多少。要向在方法内部获得当前对象的引用,java提供关键字this。this只能在方法内部使用,表示对调用方法的哪个对象的引用。如果方法调用同一个类的另一个方法,可以省略this(也推荐省略)。

用到this:方法返回当前对象,将当前对象传递给其他方法

 5.4.1 在构造器中调用构造器

this(***)的方式:将产生对符合次参数列表的某个构造器的明确调用。必须位于构造器首部且只能用一次!

5.4.2static方法的含义

static方法就是没有this的方法,有全局函数的语义。

 

5.5清理:终结处理finalization和垃圾回收

允许java类定义一个finalize()的方法,在垃圾回收执行前调用,处理一些回收工作。

如果处理垃圾回收器干不了的与内存回收无关的清理工作,则必须手动定义和调用其它普通的java方法。

5.5.1 finalize()的用途

垃圾回收及其相关行为finalize只与内存回收有关,finalize:通过创建对象的方式以外的方式为对象分配了内存。

"本地方法":调用非java代码,需要finalize中的本地方法调用free

5.5.2你必须实施清理

java不允许局部对象,所以没有析构函数,如果需要手动清理工作,则需调用某个java方法。

垃圾回收只有在jvm内存耗尽时才会执行,否则在程序结束时将内存直接交回操作系统。

5.5.3终结条件

finalize()很难用到,但有一个有趣的用法叫做终结条件验证???

对象被清理时必须处于某种状态,否则即使引用丢失,也不能被回收,finalize可以捕获这种缺陷并进行异常处理!

5.5.4 垃圾回收器如何工作

java的垃圾回收器可以提高对象的创建速度???

java堆分配的速度,甚至可以和其它语言堆栈分配的速度媲美!

java的“堆指针”在分配一个对象后移动到尚未分配的区域

当内存耗尽,垃圾回收器介入,回收空间并使堆中的对象紧密排列,避免页面错误。

垃圾回收器原理:自适应的,分代的,停止-复制、标记-清扫

 

5.6成员初始化

保证所有变量在使用前都能得到恰当的初始化。

5.6.1指定初始化

在定义类成员变量的地方赋值,每个对象都会具有相同的初始值

 

5.7构造器初始化

5.7.1初始化顺序:定义的顺序,构造器调用之前其实已经完成自动初始化

5.7.2 静态数据初始化

如果没有初始化,则会初始化为标准值或null

同样可以在定义处初始化

静态对象先于非静态对象初始化,且只初始化一次!P95

5.7.3显示的静态初始化

static{

***

}

5.7.4非静态实例初始化

也可以{}定义初始化语句,支持匿名内部类

 

5.8数组初始化

数组是相同类型封装到一起的对象序列或基本类型序列。

编译器不允许指定数组的大小(因为没有为数组对象分配空间,必须初始化)

内容简单p100-p101

5.8.1可变参数列表

实质上一个隐式的数组 f(Objcet... args)

使重载方法识别变得复杂

5.9枚举类型