以前对于final, finally, finalize() 不是很了解,查阅资料后,写下自己的笔记,权当消化。简而言之, 顾名思义,final 即最终的,也就说被 final修饰的所有东西都不能再改变。
1. 关键字 final
1.1 final 修饰变量:静态变量 & 非静态变量
1.2 final 修饰方法
1.3 final修饰义类
1.1 final 修饰变量
1.1.1 fiinal 修饰非静态变量
在定义时直接初始化变量
public final int NUM = 10;
被 final 修饰的变量赋值后,其值不能够改变,该变量相当于常量,变量用大写字母表示。
在初始化块中进行初始化
public final int NUM;
// 初始化块
{
NUM = 10;
}
在构造器中初始化
public class Test(String [] args){
private final int NUM;
public Test(){
NUM = 10;
}
}
1.1.2 final 修饰静态变量
在定义时直接初始化
public static final int NUM = 10;
和非静态变量一样,被final修饰的静态变量值不能改变,而且该变量属于类,被该类的所有实例共享。
在静态代码块中初始化
private static final int NUM;
// 静态代码块
static {
NUM = 10;
}
需要注意的是:
final 修饰的变量必须被初始化,否则无法通过编译;
当用代码块初始化 final 修饰的变量时, 静态变量只能在静态代码块中初始化,非静态变量只能在非静态代码块中初始化;
final 修饰的 静态变量不能在构造器中初始化。
1.2 final 修饰方法
final 修饰方法时,该方法不能被覆盖。也就是说,当一个父类中有 final 修饰的方法时,在其子类中该方法不能被覆盖。
1.3 final 修饰类
final 修饰类时,该类不能被继承,因此 final 不能用来修饰 抽象类和接口。
2. finally
finally 在 try / catch 语句中使用 如:
try{
throw NullPoinertException();
}catch(NullPointerException e){
System.out.println("出现空指针异常");
}finally{
System.out.println("finally最后一定被执行");
}
当出现异常时,需要释放一些资源和还原状态,所以适合把这些代码放到 finally 的代码块中,最后一定被执行。
3. finalize()
finalize() 方法在 Java 的垃圾回收期(GC)清理其从属对象时被调用。该方法用来释放资源或执行一些清理工作。
Public class FinallyTest{
protected void finalize() throws Throwable{
System.out.println("调用了finalize()方法");
}
public static void main(String [] args){
FinallyTest ft = new FinallyTest();
ft.gc(); // 调用垃圾回收器
}
} // 运行结果显示:调用了finalize()方法