thinking in java笔记 5 初始化与清理
方法重载
重载的原因:
1)相同的方法名可包含不同的含义,不能要求具有细微差别的方法都具有不同的方法名。
2)构造器名由类名决定,只能由一个构造器名,想用多种方式创建一个对象,必须实现重载。
每个重载的方法必须有独一无二的参数类型列表。参数类型列表包括类名和方法的形参列表,不包含返回值类型。因为有时你并不关心方法的返回值,想要的只是方法调用的其他效果(为了副作用而调用),这时你可能会调用方法而忽略其返回值。如void f() {}; int f() {},当调用f()时则区分调用的是哪个方法。
涉及基本类型的重载:
如果传入的数据类型小于方法中声明的形参类型,实际数据类型就会提升。char型不同,如果无法找到恰好接受char参数的方法,则把char直接提升至int型。如果传入的实际参数类型较大,则必须通过类型转换来执行窄化转换,否则会报错。
构造器和this 如果没有定义构造器,则编译器创建一个默认构造器(无参),如果自定义了构造器,编译器则不创建。
在构造器中可调用其他的构造器,如this(); this(3)。注意:Constructor call must be the first statement in a constructor。
构造函数可为private,如单例模式中。用于不想被直接创建对象的类中,此类也不可被extends。
清理 1)finalize()与析构函数
一旦gc准备好释放对象占用的存储空间,将调用finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
在C++中,对象一定会被销毁,而java中的对象却不一定会被垃圾回收。
因此,在java中,在你不再需要某个对象之前,如果必须执行某些动作,必须自己创建清理方法。
2)finalize用途
无论对象如何创建,gc都负责释放对象占据的所有内存。
在java中调用非java代码时,使用finalize来释放存储空间(c,c++ free()方法来释放)。
finalize可用于验证终结条件,清理对象时来验证是否有未适当清理的部分。、
3)gc
其他语言中,在堆上分配对象的代价很高,java中不是,gc有助于提高对象的创建速度,达到其他语言在堆栈上分配空间的速度。
- 初始化
初始化顺序:静态对象 成员变量,构造函数成员变量有默认初始化值,局部变量没有。对象的创建过程1)java解释器查找类路径,定位 Dog.class文件2)载入Dog.class,执行静态初始化的所有动作(首次加载的时候创建)3)new Dog()创建对象的时候,首先在堆上未Dog对象分配足够的存储空间。4)这块存储空间被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值5)执行所有出现于字段定义处的初始化动作6)执行构造器静态子句:java中允许将多个静态初始化动作组织成一个静态子句。如:也有非静态实例初始化:public class Spoon{static int i;static { //静态子句i=8;}int j;{ //非静态实例初始化j=6;}}
这种语法对于支持匿名内部类是必须的。
数组初始化 编译器不允许指定数组的大小。数组定义的是一个引用。
若在编写程序时,不能确定数组内元素个数,可以用new在数组内创建元素。
int[] a; a=new int[new Random(40).nextInt(20)];
数组的创建是在运行时刻进行的,数组中的基本类型数据类型值会自动初始化为空值。
如果忘记创建对象,并试图使用数组中的空引用,会在运行时产生异常。可以用花括号括起来的列表来初始化对象数组,Integer[] b={new Integer(1),new Integer(3),4}.初始化列表的最后一个逗号是可选的(使长列表更易于维护)。
可变参数列表:
不用再显式编写数组语法,指定参数时,编译器会自动填充数组。
void printArray(Object... args){
for(Object obj:args)
//do something
}
printArray(new Integer(46),new Float(4.2));
枚举类型 常见enum时,编译器会自动添加一些有用的特性,如toString();ordinal();
enum是类,在生成时添加了一些编译器行为。enum与switch搭配使用最为合适。
另外经常使用enum来配置常量字符串。
public static enum Relationship {
GoodFriend(" 亲密好友 "), CommonFriend(" 普通朋友 "), BLACK(" 不受欢迎 ");
private String v;
Relationship(String value) {
v = value;
}
@Override
public String toString() {
return v;
}
}