一、构造器
1. 重载
重载根据参数的数量、类型、顺序来区分同名方法,但不能根据返回值来区分。
如两个方法:
void f(){}
int f(){ return 1;}
调用的时候只写了f(),编译器无法确定你想要调用的是哪一个。
2. 构造器
除构造器外,编译器禁止在其他任何方法中调用构造器;
二、 清理:终结处理和垃圾回收
Java虚拟机具有自动垃圾回收机制,在合适的时候,虚拟机会开启一个线程,去清理垃圾对象。
但是,Java里的对象并非总是被垃圾回收的。你会发现,只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。如果程序执行结束,并且垃圾回收器一直都没有释放你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。这个策略是恰当的,因为垃圾回收本身也会有开销,要是不使用它,那就不用支付这部分开销了。
1. finalize()方法
一旦垃圾回收器准备好释放对象占用的存储空间,会首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象的内存。所以要是你打算用该方法,就能在垃圾回收时刻做一些重要的清理工作。我们可能会认为当一个对象中含有其他对象时,而垃圾回收只清空了当前对象的内存,实则不然,垃圾回收会清理该对象所占用的所有内存,那么finalize()方法到底在什么时候使用呢?
而finalize()方法的使用场合很有限——这种情况主要发生在使用“本地方法”时,本地方法是一种在Java中调用非Java方法的方式。在非Java代码中,也许会调用C的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存泄露。当然,free()是C和C++中的函数,所以需要在finalize()中使用本地方法调用它。
finalize()方法还有一个作用,由于程序员的错误,可能一些没有被引用的对象还是有用的或者是不能被回收的。我们可以在finalize()方法在回收之前做一个判断,是否满足被回收的要求,如果不满足回收要求,需要进行异常处理。
2. System.gc()方法
System.gc()用于强制进行终结动作。它提醒虚拟机:程序员希望进行一次垃圾回收,但不能保证垃圾回收一定执行,而且什么时候执行取决于VIM,不同的VIM有不同的对策。
三、初始化顺序
在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,他们仍然会在任何方法(包括构造器)被调用之前得到初始化。
1. 静态数据初始化
静态变量、静态方法、静态代码块:
在创建第一个类对象时,静态数据才会被舒适化。之后,静态对象不会再次被初始化。
2. 可变参数列表
方法的参数为数组时,可以写成可变参数列表的样式:
void f(Object... args){ }
//调用时:
f(47,"one",new A()); //可以任意长度的object对象
f((Obect[]) new Integer[]{1,2,3,4}); //可以是一个数组
f(); //可以为空
//还可以定义这种:
void f(int required,String... trailing){ }
有了可变参数,就再也不用显式地编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。