『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() 方法存在几个问题:

  1. 不确定性:finalize() 方法被调用的具体时间是不确定的。垃圾收集器运行的时间取决于多种因素,包括 JVM 的内存使用情况、垃圾收集算法等。这意味着,从对象不再有引用到 finalize() 方法被调用之间的时间可能非常长,甚至可能永远不会被调用。
  2. 性能问题:由于 finalize() 执行不确定,且可能影响垃圾收集的效率,过度依赖 finalize() 方法可能会导致性能问题,例如延迟对象内存的回收,或导致内存泄漏。
  3. 资源释放:如果你在 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 是你整理游戏场地,确保一切都已妥善处理后才离开的保障。它保证了,在你完成游戏之后,不管结果如何,都会有一些后处理工作被执行以维持场地的正常运作。

posted @ 2024-03-18 00:58  BNTang  阅读(66)  评论(0)    收藏  举报