欢迎光临
我们一直在努力

【大白话说Java面试题】【Java基础篇】第37题:final、finally、finalize的区别


📌 专栏:大白话说Java面试题 — 01-Java基础篇

第37题:final、finally、finalize的区别

📚 回答:

  • 核心对比: final、finally 和 finalize 是三个看似相似但功能完全不同的关键字或方法,它们在 Java 中的应用场景和作用各不相同。

1. final
  • 定义:

    • final 是一个修饰符,用于声明类、属性和方法。
    • 类:被 final 修饰的类不能被继承。
    • 属性:被 final 修饰的变量不可变(基本类型值不可更改,引用类型地址不可更改)。
    • 方法:被 final 修饰的方法不能被子类重写。

    💡 代码示例: 以下代码展示了 final 的用法:

final class FinalClass {
// 该类不能被继承
}

class Example {
final int MAX_VALUE = 100; // 不可变变量
final void display() {
System.out.println("This method cannot be overridden");
}
}


2. finally
  • 定义:

    • finally 是异常处理机制的一部分,无论是否发生异常,finally 块中的代码都会执行。
    • 常用于释放资源(如关闭文件流、数据库连接等)。
  • 注意事项:

    • 如果在 try 或 catch 中调用了 System.exit(0),则 finally 块不会执行。

    💡 代码示例: 以下代码展示了 finally 的用法:

try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
} finally {
System.out.println("无论是否异常,都会执行");
}


3. finalize
  • 定义:

    • finalize 是 Object 类中的一个方法,在垃圾回收器(GC)回收对象之前会调用该方法。
    • 主要用于清理资源(如关闭文件句柄、释放内存等)。
  • 注意事项:

    • JVM 不保证 finalize 方法一定会被调用。
    • 从 Java 9 开始,finalize 被标记为过时(Deprecated),推荐使用 AutoCloseable 接口(如 try-with-resources)来管理资源。

    💡 代码示例: 以下代码展示了 finalize 的用法:

class Resource {
@Override
protected void finalize() throws Throwable {
System.out.println("资源被释放");
}
}

public class Main {
public static void main(String[] args) {
Resource resource = new Resource();
resource = null; // 断开引用
System.gc(); // 建议JVM进行垃圾回收
}
}


4. 对比总结
特性finalfinallyfinalize
用途 修饰类、属性、方法 异常处理中确保代码块一定会执行 在 GC 回收对象前进行资源清理
可变性 不可变 总是执行 不保证一定会执行
适用场景 防止继承、重写或修改 资源释放、善后处理 过时,推荐使用 try-with-resources

💡 面试官视角:

  • 面试官可能会问“finally 是否一定会执行?”答:除非调用了 System.exit(0) 或 JVM 崩溃,否则 finally 块一定会执行。
  • 面试官可能会追问“为什么 finalize 被废弃?”答:因为 finalize 的执行时机不确定,可能导致资源延迟释放或未释放,推荐使用更可靠的资源管理方式(如 try-with-resources)。
赞(0)
未经允许不得转载:171主机测评 » 【大白话说Java面试题】【Java基础篇】第37题:final、finally、finalize的区别
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址