-
修饰变量:
- 当
final
用于变量时,表示该变量的值在初始化后不能再被修改。对于基本数据类型,它表示值不能改变;对于引用类型,它表示引用的对象不能改变,但对象本身的内容仍然可以修改。
final int x = 10; x = 20; // 编译错误,x的值不能修改
- 当
-
修饰方法:
- 当
final
用于方法时,表示该方法不能被子类重写。这样可以确保方法的行为不会被改变,常用于设计不可变行为或重要的核心方法。
class Parent { public final void show() { System.out.println("This is a final method."); } } class Child extends Parent { // 无法重写 show() 方法,会导致编译错误 }
- 当
-
修饰类:
- 当
final
用于类时,表示该类不能被继承。这常常用于防止类被进一步扩展,保证类的设计不被修改。
final class MyClass { // 类的定义 } // 下面的代码会报错,无法继承 MyClass class SubClass extends MyClass {}
- 当
finally
关键字
finally
是 Java 异常处理机制的一部分,用于定义一个在 try-catch
块后一定会执行的代码块,无论是否发生异常。finally
块通常用于释放资源、清理操作或者执行其他必须执行的代码。
finally
的特点:
- 无论是否发生异常,都会执行:
- 无论
try
块是否抛出异常,finally
中的代码都会被执行。即使在catch
块中有return
语句,finally
依然会执行。
- 无论
- 在
try-catch
之后执行:- 如果没有异常,
finally
会在try
块的代码执行完后执行;如果有异常,则会在catch
块处理完异常后执行。
- 如果没有异常,
示例:
public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("In try block.");
int result = 10 / 0; // 抛出异常
} catch (ArithmeticException e) {
System.out.println("Caught exception: " + e);
} finally {
System.out.println("This will always execute.");
}
}
}
输出:
In try block.
Caught exception: java.lang.ArithmeticException: / by zero
This will always execute.
即使在 try
块中发生了异常,finally
仍然会执行。
何时使用 finally
:
finally
块常常用于:
- 释放资源:例如关闭数据库连接、文件流等。
- 清理操作:例如清除临时文件、重置应用状态等。
注意事项:
- 异常传播:
- 如果在
finally
块中也抛出了异常,它会覆盖之前try
或catch
中抛出的异常。因此,在finally
块中要小心抛出异常,通常避免这样做。
- 如果在
- 与
return
语句的交互:- 如果
try
或catch
中有return
语句,finally
块仍然会执行,并且会在方法返回之前执行。若finally
中也有return
,则可能会影响方法的返回值。
- 如果
示例:finally
和 return
的交互
public class FinallyReturnExample {
public static int test() {
try {
System.out.println("In try block.");
return 1;
} finally {
System.out.println("In finally block.");
}
}
public static void main(String[] args) {
int result = test();
System.out.println("Returned value: " + result);
}
}
输出:
In try block.
In finally block.
Returned value: 1
即使 finally
块中有代码,try
块的 return
仍然会首先执行,但 finally
块的代码会在方法返回之前执行。