Fork me on GitHub

Java编程思想———初始化与清理

默认构造器

默认构造器(又名无参构造器)是没有形式参数的,它的作用是创建一个“默认对象”。如果你写的类中没有构造器,则编译器会自动帮你创建一个默认构造器。

如果已经定义了一个构造器,编译器就不会帮你自动创建默认构造器。

在构造器中调用构造器

可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可用this关键字做到这一点。

尽管可以用this调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始处,否则编译会报错。

垃圾回收

1
2
3
4
@Override
protected void finalize() throws Throwable {
super.finalize();
}

垃圾回收器会特别对待覆盖了finalize()方法的对象。一般情况下,在垃圾回收期间,一个无法触及的对象会立即被销毁。不过,覆盖了finalize()方法的对象会被移动到一个队列(F-Queue)里,一个独立的线程遍历这个队列,调用每一个对象的finalize()方法。在finalize()方法调用结束之后,这些对象才成为真正的垃圾,等待下一轮垃圾回收。

一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。

不该将finalize()作为通用的清理方法,finalize()是一个用于释放非Java资源的方法。

之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非Java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非本地代码的方式。

初始化

初始化的顺序是先静态对象(如果它们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象。静态初始化动作只进行一次。

求鼓励,求支持!