第五章 初始化与清理
c++引入了构造器(construetor)的概念
5.1用构造器确保初始化
①通过提供构造器,类的设计者可确保每个对象都会得到初始化(可以假想为编写的每个类都定义一个initialize()方法)
②默认的构造器=无参构造器
③构造器有助于减少错误,并使代码更易于阅读
④构造器是一种特殊类型的方法,因为它没有返回值
5.2方法重载
1、所谓的方法则使给某个动作去的名字
2、构造器重启提供了多种方式创建对象
3、要是对明显相同的概念使用不同的民=名字,那一定会让人纳闷,方法的重载,完美的解决了这个问题
5.2.1设计基本类型的重载
1、基本类型能从一个“较小”的类型自动提升至一个“较大”的类型(char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升至int型)
2、如果传入的实际参数较大,就得通过类型转换来执行窄化转换,如果不这样做,编译器会报错
5.2.2以返回值区分重载方法(行不通)
5.4this关键字
面向对象语言在不同对象调用同一个方法时,会暗自把“所操作对象的引用”作为第一个参数传递给方法,案例如下
class Banana{void peel(int i){/*...*/}}
public class BananaPeel{
public static void main(String[] args){
Banana a=new Banana(),
b=new Banana();
a.peel(1);
b.peel(2);
}
}
方法的调用其实是这样的
Banana.peel(a,1);
Banana.peel(b,2);
this关键字(上面的引用是编译器“偷偷”传入的,所有没有标识符可用,引入了this就是表示的当前的对象):
1、只能在方法内部使用,表示的对“调用方法的那个对象”的引用
2、当前方法中的this引用会自动应用于同一类中的其他方法,所以方法内部调用同一类中另一个方法this可以省略
5.4.1 在构造器中调用构造器
作用:为了避免代码的重复
5.4.2 staitc含义
1、staitc方法就是没有this的方法
2、static 方法不能调用非静态方法(非静态方法可以调用static方法)
因为可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法,这实际上就是static方法的主要用途
3、java中禁止使用全局方法,但是你在类中置入static方法就可以访问其他的static方法和static域
有些人认为static方法不是“面向对象”的,因为它们的确具有全局函数的含义,要是在代码中出现大量的static方法,就该重新考虑自己的设计了。
5.5 清理:终结处理的垃圾回收
java有垃圾回收器负责回收无用的对象占据的内存资源。
1、假定对象(并非使用new)获得一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由 new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。
解决办法:java提供了finalize()方法
2、一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次来及回收动作发生时,才会真正回收对象占用的内存,所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作
5.5.1 finalize()用途何在
1、垃圾回收只与内存有关
5.6 成员初始化
Java尽力保证:所有变量在使用前都能得到恰当的初始化
1、对于方法的局部变量,java以编译时错误的形式来贯彻这种保证(方法的局部变量未初始化就被调用会报错)
2、在类里定义一个对象的引用时,如果不将其初始化,此引用就会获得一个特殊值null
5.6.1 指定初始化
变量赋初值方法
1、定义类成员变量的时候为其赋值
2、通过调用某个方法来提供初值
5.7 初始化构造器
1、无法阻止自动初始化的进行,它将在构造器被调用前发生
5.7.1 初始化顺序
先成员变量初始化------>再构造器
5.7.2 静态数据初始化
1、无论创建多少对象,静态数据都只占一份存储区域
初始化条件:
1、对象被创建或者第一次访问静态变量
2、特征:只初始化一次
5.7.3 显示的静态初始化
当首次生产这个 类的一个对象时,或者首次访问术语那个类的静态数据成员时(即便从未生成过那个类的对象)
5.7.4 非静态实例初始化
非静态变量初始化在调用构造器之前发生,属于对象
5.8.1 可变参数列表
java 5新特性
1、标准java库中的类能输出有意义 的内容(因为类型重写了toString()方法)
2、自建的类的对象,若不加toString()方法,只会输出地址。
3、在可变参数列表中可以使用任何类型的参数,包括基本类型
总结”:
构造器,精巧的初始化机制,暗示着初始化在java中占有至关重要的地位,大量的编程错误都源于不正确的初始化,构造器能够保证正确的初始化和清理(没有正确的构造器调用,编译器就不允许创建对象)