『Java 语法基础』final、finalize 和 finally 的不同之处
final
final 是一个修饰符,是 Java 编程语言中的一个关键字,可以用来修饰变量、方法、以及类。使用 final
的效果是不同的,取决于它修饰的对象类型。下面我会分别解释 final
修饰变量、方法和类时的效果。
final 修饰变量
当 final
修饰一个变量时,这个变量就变成了一个常量,也就是说它的值只能被赋值一次,一旦赋值之后就不能被修改了。如果尝试修改 final
变量的值,编译器会报错。
final int number = 10; // 初始化 final 变量
// number = 15; // 编译错误,不能修改 final 变量的值
final 修饰方法
当 final
修饰一个类的方法时,这个方法不能被子类覆盖或重写。这意味着子类不能提供一个具有相同名称和参数类型的方法。
class Parent {
final void show() {
System.out.println("这是一个 final 方法。");
}
}
class Child extends Parent {
// 编译错误,不能覆盖 final 方法
// void show() {
// System.out.println("尝试覆盖 final 方法。");
// }
}
final 修饰类
当 final
修饰一个类时,表示这个类不能被继承。换句话说,没有其他类能够继承 final 类。
final class FinalClass {
// 类的定义
}
// 编译错误,不能继承 final 类
// class SubClass extends FinalClass {
// }
finalize
finalize()
方法在 Java 中是与对象生命周期关联的一个概念。当一个对象不再有任何的引用指向它,也就是说,这个对象不再被程序中的其他部分所需要时,Java 虚拟机(JVM)的垃圾收集器(GC)可能会考虑将其回收以释放内存资源。在垃圾收集器决定回收对象之前,finalize()
方法会被调用,给予了这个对象一个机会来进行清理工作,比如关闭打开的资源等。
然而,finalize()
方法存在几个问题:
- 不确定性:
finalize()
方法被调用的具体时间是不确定的。垃圾收集器运行的时间取决于多种因素,包括 JVM 的内存使用情况、垃圾收集算法等。这意味着,从对象不再有引用到finalize()
方法被调用之间的时间可能非常长,甚至可能永远不会被调用。 - 性能问题:由于
finalize()
执行不确定,且可能影响垃圾收集的效率,过度依赖finalize()
方法可能会导致性能问题,例如延迟对象内存的回收,或导致内存泄漏。 - 资源释放:如果你在
finalize()
方法中处理类似于文件关闭等操作,可能会导致资源无法及时释放。如果你的应用程序打开了大量文件且依赖于finalize()
方法来关闭这些文件,可能会导致资源耗尽,因为垃圾收集器没有及时调用finalize()
方法。
因此,通常的最佳实践是避免使用 finalize()
方法来清理资源。相反,推荐使用 try-with-resources 语句或者显式的清理方法,例如,在你控制资源的代码块中使用 try-catch-finally 来确保资源始终得到适当的释放。
简而言之,finalize()
方法可以看作是在对象生命周期结束前的 “最后通牒”,虽然你可以在这里做一些清理工作,但它的执行是不可预测的,并且可能会给程序带来更多问题,因此不建议依赖它来释放资源或做其他关键操作。
finally
finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。
想象一下,你在游乐场玩抛球游戏。try
块就像是你向篮筐投球的尝试,如果球进了篮筐,那就意味着没有发生错误,你的代码运行正常。而如果球没有进篮筐,这就好比发生了异常,这时候 catch
块就会介入,像是游戏工作人员过来告诉你什么出了问题,并给你另一次机会。
现在,打个比方,无论你是否成功将球投入篮筐(即无论 try
块中的代码是否成功运行),你都必须将球还给工作人员,这个动作就像是 finally
块。finally
块确保了无论之前发生了什么,一些必须进行的清理工作(比如归还球)都会被执行。这表示即便在 try
块中代码顺利执行或 catch
块捕获到异常后运行相应的错误处理代码,finally
块中的代码也总是会被执行。这通常是用来释放资源,比如关闭文件流或数据库连接。
简言之,finally
是你整理游戏场地,确保一切都已妥善处理后才离开的保障。它保证了,在你完成游戏之后,不管结果如何,都会有一些后处理工作被执行以维持场地的正常运作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!