10.final, finally, finalize的区别
10.final, finally, finalize的区别
final:
final变量:被修饰的变量不可变,不可变分为 引用不可变 和 对象不可变 ,final 指的是引用不可变。
-
可以修饰类,属性和方法。
-
修饰类时,此类不能被继承。修饰属性时,该变量会变成常量而且必须要初始化,一般和static使用。修饰方法的时候,此方法不能被重写,子类可以用该方法不能重写。
// final 类:不可继承 final class CoreBusiness {// final 方法:不可重写final void strategy() {System.out.println("公司核心战略不可更改");} }// 尝试继承会报错 // class SubBusiness extends CoreBusiness {} // 编译错误public class Main {public static void main(String[] args) {final int contractID = 20230414; // final 变量:不可修改// contractID = 20230415; // 编译错误System.out.println("合同编号: " + contractID);} }
finally:
finally 是作为异常处理的一部分,只能在try/catch语句中使用,并且带一个语句块表示这段语句最终一定被执行(无论是否抛出异常),经常用在需要释放资源的时候使用,System.exit(0) 可以阻断finally的执行。
public class ContractProcessing {public static void main(String[] args) {try {// 模拟合同审核int result = 10 / 0; // 假设审核失败(抛出异常)} catch (ArithmeticException e) {System.out.println("合同审核失败: " + e.getMessage());} finally {// 无论审核结果,都执行资源清理System.out.println("归档审核记录并关闭系统");}}
}
finalize:
- 这个是在 java.lang.Object 里定义的方法,每一个对象都有这一个方法,在gc启动时候,此对象被回收的时候被调用。
- finalize这个方法只会执行一次,finalize方法被调用不一定会立刻把该对象回收,所以有可能调用finalize后,该对象又要被使用,不回收了,当下次要真正回收的时候finalize就不会执行,产生了问题,不推荐使用finalize方法
class Business {@Overrideprotected void finalize() throws Throwable {try {System.out.println("公司资源正在清理(如关闭服务器)");} finally {super.finalize();}}
}public class Main {public static void main(String[] args) {Business company = new Business();company = null; // 对象变为可回收System.gc(); // 建议 JVM 执行垃圾回收}
}