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 替代。

结语

程序运行时会占用电脑的「有限资源」(比如内存、文件句柄、网络连接),资源释放就是把这些占用的资源 “还回去”,供其他程序 / 代码使用,避免资源泄露