要深入学习java,了解初始化和清理过程时必不可少的。
构造器
构造器是一个特殊的方法,它名字与类名相同,没有返回值(不同于void),可以含参数列表(没有任何参数则为默认构造器,如果你的类没有构造器,则编译器会自动创建一个默认构造器)。使用new语句则调用构造器,会为对象分配存储空间。
方法重载
在前面我们看到,几个构造器名字相同,为了解决名字相同造成的冲突问题,java引入了一种叫方法重载的机制。 所谓重载,即在一个类里面,方法名字相同而参数不同,返回类型、修饰符可同可不同。所以,对于重载方法,由于它们名字相同,唯一的区分标准就是形参列表。那么为什么不能以返回值区分呢(修饰符只起修饰作用)?原因就是当我们不需要返回值只是单纯调用方法执行某种操作时,编译器就不知道该调用哪种方法来。例如
void f(){}
int f(){return 1;}
调用f()
另外,当调用重载方法时,若传入的参数类型小于形参,则会自动转换类型;若传入实参较大,就需要类型转换来窄化转换。
this关键字
this关键字只能在方法中使用,表示对“调用方法的那个对象”的引用。常用于return或把当前对象传递给其他方法。另外在构造器中使用this也可表示调用其他构造器。还有一种用法就是若方法参数s和类的数据成员名字相同,也可用this.s区分开来。
static的补充
利用this,可从另外一个角度解读static:
- static方法就是没有this的方法(因为没有对象);
- 在static的内部不能调用非静态方法。
清理:终结处理和垃圾回收
要深入理解清理需要学习jvm,限于知识的缺乏目前只能先记一点知识点。 关于垃圾回收,有三点需要注意:
- 对象可能不被垃圾回收;
- 垃圾回收并不等于C++的“析构”;
- 垃圾回收只与内存有关 并且jvm在未面临内存耗尽时不会进行垃圾回收。 在java 中有一个finalize()方法,当垃圾回收器准备回收对象时首先调用finalize ()方法,并在下一次垃圾回收时真正回收对象的内存。
成员初始化
java尽力保证每个变量使用前都被初始化。其中,类的每个基本类型数据成员都有一个初始值(默认值),对于对象则为null。
构造器初始化
关于初始化的顺序,类中数据成员会先自动初始化,然后构造器初始化。 对于静态数据的初始化,则是先初始化静态对象(且只初始化一次),然后初始化非静态对象。另外在java中有一个叫静态子句的东西,它把多个静态初始化动作组织在一起,如下
static int i;
static double d;
static{
i = 1;
d = 2.2;
}
这样的静态子句也会被执行,且只被执行一次。 如果去掉static就叫非静态初始化子句,它可被执行多次且在构造器前执行。
数组初始化
数组在java中会自动检查边界,避免不可控行为的发生,付出的代价是效率降低。 可以使用new在数组里创建元素,但不能创建单个基本类型数据。 有时候我们会看到有这样的代码
static void fun(Object... args){
//
}
这其实是可变参数列表,可以看作数组的推广,这样在调用该方法的时候就可以传入多个该类型的参数。但是这样遇到重载就会出现问题,所以只能在重载方法的一个版本上使用可变参数列表或者不用!