5.1 用构造器确保初始化
1)构造器名称必须与类名完全一样,因此每个方法的首字母应该小写的规则不适应构造方法。
2)java中,“初始化”和“创建”捆绑在一起,二者不分离。
3)构造方法没有返回值。
5.2 方法重载
1)既然构造方法必须和类名一致,当需要使用不同类型的参数来构造对象时,该怎么办呢?因此,构造方法是必须使用方法重载的原因之一。
2)重载规则:每个重载方法必须有一个独一无二的参数类型列表,甚至参数顺序不同也可以用于方法重载,但是一般不推荐使用
3)对于char、byte、short、int、long、float、double:如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升;char略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int类型。
4)如果传入参数类型大于形式参数类型,必须通过窄化转化(向下转型)来操作,否则编译器会报错。
5)不可以返回值类型来区别重载。
5.3 默认构造器
1)若没有创建构造器,编译器就自动创建一个默认构造器;否则不创建。
5.4 this关键字
1)this表示“调用方法的那个对象”,即当前对象。一般作为当前对象的引用。
2)应用:如果要把自身返回,可以使用return this;或者想把当前对象作为参数传递,也使用this。
3)还可以在构造器中使用this,如this(String arg1,int arg2 );构造器中利用this调用其他的构造器不可以同时调用两个,而且本语句必须位于第一行。
4)除构造器外,编译器禁止在任何其他方法中调用构造器。
5)static方法就是没有this的方法。在static方法内部不能调用非static方法。可以在没有创建任何对象的前提下,通过类本身调用static方法,实际上,这正是static方法的主要用途,这看起来很像全局方法。
5.5 清理:终结处理和垃圾回收
1)Java有垃圾回收器负责回收无用对象占据的内存资源。然而,垃圾回收器一般只知道释放那些经由new分配的内存,对于非new创建的内存,它不知怎么释放。
2)finalize()的工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才真正回收对象占用的内存。
3)实际上,由于java中处处是对象,对象又都是由new创建的,finalize()几乎无用武之地。其实finalize主要使用在调用“本地代码”(非java代码)的情况下,本地代码目前只支持C/C++,但这二者又可以调用其他语言,所以实际可以调用任何语言代码。
4)如果java虚拟机并未面临内存耗尽的情形,它不会执行垃圾回收。因为垃圾回收本身也是占用资源的。
5)finalize()还可以用来验证对象终结条件。可以在finalize()中加入一些验证语句,判断对象被清理之前,是否完成了某些该有的操作。
5.6 成员初始化
1)局部变量必须初始化,否则编译出错。
2)char的默认初始值是空格,对象的默认初始值是null,boolean的默认初始值是false。
3)初始化顺序:变量初始化-->构造方法-->一般方法。静态(只被初始化一次)-->非静态
4)在java中,可以将一个数组赋值给另一个数组,如:a2=a1;实际上,这仅仅是复制了引用,通过a2对数组的任何修改,a1也会产生同样的变化。
5)所有数组都有一个固有成员,length。
6)java 5以后,java提供可变参数列表,如:printArray(Object... args){};调用语句可以是printArray(new A(),new B(), "string");同时,将0个参数传递给可变参数列表是可行的。
可变参数列表与自动包装机制和谐共处。两个重载方法都有可变参数列表,应该使它们都添加一个非可变参数,否则编译出错。
5.9 枚举类型
1)创建枚举类型时,编译器会自动添加一些特性,比如:toString();ordinal();static values()。
2)enum可以在switch中使用,二者是绝佳的组合。