Contents
  1. 1. finalize()
  2. 2. final
  3. 3. finally

finalize()

finalize()用于释放不是由new分配的内存,不是析构函数!!!下一次GC时候才回收内存。
finalize()的需求应该限制到一种特殊情况,即通过某种创建对象方式以外为对象分配存储空间。
这种情况主要发生在“本地方法”的情况下。本地方法是一种在java中用非java代码方式(目前只支持c和c++)。在非java的代码中,也许会调用c的malloc()函数来分配存储空间,而且除非调用了
free()函数,否则存储空间得不到释放,从而造成内存泄露,由于free是c的函数,所以需要用finalize在本地方法中调用。

  1. 不能指望finalize进行内存清理
  2. finalize的另一个有趣用途是:终结条件的验证。(疑问:感觉try finally能做吗?)

final

根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

- final类不能被继承,没有子类,final类中的方法默认是final的。
- final方法不能被子类的方法覆盖,但可以被继承。
- final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
- final不能用于修饰构造方法。
- 注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

1、final类
final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
2、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。但不建议这么做,优化应该让jvm做。

当然子类也可以定义一个与父类的final类相同的方法名,但此时并没有覆盖方法,仅仅是生成了一个新的方法。
类中所有的private方法都隐式的指定为是final,由于无法取用private方法,因此就无法覆盖。

3、final变量(常量)
用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。
另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。
4、final参数
当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。这一特性主要用来向匿名内部类传递数据。

finally

对于没有GC和析构函数自动调用机制的语言来说,finally非常重要。能够保证无论try里面放了什么,内存总能够得到释放。
但是java中有GC,当要把除内存之外的资源恢复到初始状态时就需要finally子句。这种需要清理的资源包括:已经打开的文件或者网络连接,在屏幕上化的图形,甚至是外部世界的某个开关。

因为finally子句总是执行的阿,所以在一个方法中,可以从多个点返回并保证重要的清理工作仍旧会执行。

Contents
  1. 1. finalize()
  2. 2. final
  3. 3. finally