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默认构造器
如果不写构造器,编译器会写一个无参数构造器,将成员变量初始化(若声明的时候有初始化则为初始化值,否则值设为0,对象设为null?)。
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枚举类型
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。