一、final
- final是一个修饰符,也是一个关键字
- final修饰的类型无法被继承,经典的String类型。
- fina修饰的方法无法被覆盖,但允许重载,类的private方法会被隐式指定为final修饰。
- final修饰的变量因为不可变,所以被称为常量,存在于方法区常量池,当变量类型为基本数据类型时,变量值初始化后将不能改变,变量类型时引用类型时,变量值由于存储引用地址,所以变量引用将不能变为其他对象,但是对象内部的属性是可以修改的。
二、finally
- finally是一个关键词,修饰代码块。
- finally不能单独使用,通常于try或者try{...} catch配合使用,用于释放执行过程占用的资源。
- finally修饰的块一定会被执行,当然,如果在程序执行中,JVM异常退出,是不会执行finally块的。执行System.exit(n)也会导致finally{...}不执行。
- finally修饰的代码块会在方法结束之前执行,如果finally中含有return 语句,那么方法执行将会返回finally中的return结果,而不会执行try{...}或者catch{...}中的结果,所以一般情况不允许在finally出现return语句。代码示例:
public class FinalDemo {
public static void main(String[] args) {
System.out.println(FinalDemo.execute());
}
public static String execute() {
try {
throw new RuntimeException("ex");
//return "try";
} catch (Exception ex) {
return "catch";
} finally {
return "final";
}
}
}
三、finalize
- finalize()是Object对象的protected方法,通常子类重写该方法实现资源清理,GC在回收对象前会执行该方法。
- finalize()存在的问题:
- Java语言规范并不能保证finalize()方法能被及时执行,也不能保证一定会被执行。
- finalize()方法可能带来性能问题,因为JVM通常在单独的低优先级线程中来执行finalize()。
- finalize()方法中,可将待回收的对象赋值给GC root可达的对象引用,从而达到对象再生的目的。
- finalize()方法最多被GC执行一次,但是可以通过对象调用。