final、finally、finalize的区别及使用场景?
结论
三者没有任何关系
总结
final:是修饰符,修饰变量成常量、修饰方法不能被重写、修饰类不能被继承,核心就是「不可变」。
可以修饰变量、方法、类,核心是限制 “修改 / 重写 / 继承”,下面用最常见的变量 + 方法
// 测试final的核心特性:不可变/不可重写
public class FinalDemo {
// 1. final修饰变量(常量):赋值后不能修改
public static final double PI = 3.1415926; // 常量通常全大写
// 2. final修饰方法:子类不能重写
public final void sayHello() {
System.out.println("这是final方法,子类不能重写");
}
// 测试final变量
public static void main(String[] args) {
// 错误示例(取消注释会编译报错):final变量赋值后无法修改
// PI = 3.14;
System.out.println("final常量PI的值:" + PI);
// 测试final方法的继承限制
SubClass sub = new SubClass();
sub.sayHello(); // 只能调用父类的final方法,无法重写
}
}
// 子类
class SubClass extends FinalDemo {
// 错误示例(取消注释会编译报错):无法重写final方法
// @Override
// public void sayHello() {
// System.out.println("尝试重写final方法");
// }
}
finally(代码块)
一句话总结:异常处理的 “收尾模块”,非 JVM 退出必执行,专用于释放资源。
是异常处理的代码块,跟 try/catch 绑定,不管有没有异常,里面的代码一定执行,主要用来关资源。
finalize
finalize:是Object 类的方法,GC 回收对象前会调用它做收尾,JDK9 之后已经被废弃,现在都用 try-finally 替代。
结语
程序运行时会占用电脑的「有限资源」(比如内存、文件句柄、网络连接),资源释放就是把这些占用的资源 “还回去”,供其他程序 / 代码使用,避免资源泄露