【问题标题】:Difference between final keyword, finally block and finalized method in java throught one good example [duplicate]java中final关键字,finally块和finalize方法之间的区别通过一个很好的例子[重复]
【发布时间】:2015-03-05 03:22:18
【问题描述】:

这些关键字常常让我感到困惑。

谁能告诉我它们之间的确切区别是什么?

【问题讨论】:

  • 什么是“终于写博客”?您是指异常处理上下文中的 finally 子句吗?
  • @bigdestroyer,感谢分享链接。这将帮助我理清概念。
  • final 表示无法重新分配变量。它意味着不能“修改”对象(通过调用对象上的方法,例如ArrayList)。 finallytry-catch 结构中使用的完全不同。
  • @aviad 对不起我的拼写错误,我指的是 finally 块。

标签: java final finally finalize


【解决方案1】:

最终关键字

在一个类上,这意味着你禁止让一个子类扩展你的。

public final class finalClass

属性/字段

final MyObject value = new MyObject() 表示您将无法修改对象的实例。

value = xxxx 不会被允许,但您仍然可以修改对象本身 value.field = "xxx";

方法 当您在方法上使用final 时,这意味着您将禁止扩展您的类的子类覆盖此方法。

public final void finalMethod()

它也可以用在参数上,这意味着你不允许其他人修改你给的对象的实例。

public void myMethod(final MyObject myObject)

最终用户将无法做到myObject = ...


终于屏蔽了

finally 块与final 无关,它在捕获异常时使用,以确保无论是否有异常都会运行一部分代码。

try { ...}
catch {} // Optional
finally { // Code that will be ran, exception or not being thrown}


完成方法

当它被销毁(通常是垃圾收集)时,它会在每个对象上调用。

【讨论】:

  • 感谢您回答我的问题,我现在对 final 关键字有所了解。我仍然对 finally 和 finalized 方法感到困惑。
  • @MitulMaheshwari finalize 将在每个对象被销毁时自动调用。据我所知,没什么好说的了。
  • 感谢您提供如此好的解释。我已经为答案投票了。
  • 没问题,其他的也看一下,我可能还不够完整。
【解决方案2】:

Final:-用于以下情况:

  • 如果将 final 关键字附加到变量,则该变量将变为常量,即其值不能在程序中更改。
  • 如果方法被标记为 final,则该方法不能被任何其他方法覆盖。
  • 如果一个类被标记为 final,那么这个类就不能被任何其他类继承。
  • 如果一个参数被标记为 final,它将成为一个只读参数。

Finally:-

如果在 try 块中抛出异常,则控制直接传递到 catch 块,而不执行在 try 块的剩余部分中编写的代码行。 如果出现异常,我们可能需要清理我们创建的一些对象。如果我们在 try 块中进行清理,它们可能不会在出现异常的情况下执行。 因此使用 finally 块,其中包含用于清理的代码,并且总是在 try ...catch 块之后执行。

Finalize:-

这是一个存在于类中的方法,在其任何对象被垃圾收集器回收之前被调用。 finalize() 方法用于在对象被垃圾回收器回收之前执行代码清理。

【讨论】:

    【解决方案3】:

    最终

    用于以下三种情况:

    1. 如果将 final 关键字附加到变量,则该变量将变为常量,即其值不能在程序中更改。
    2. 如果方法被标记为 final,则该方法不能被任何其他方法覆盖。
    3. 如果一个类被标记为 final,那么这个类就不能被任何其他类继承。

    来源:http://www.go4expert.com/articles/final-finally-finalize-java-t28061/

    终于

    finally 块总是在 try 块退出时执行。这可确保即使发生意外异常,也会执行 finally 块。但是finally 不仅仅用于异常处理——它允许程序员避免清理代码被returncontinuebreak 意外绕过。将清理代码放在 finally 块中始终是一种很好的做法,即使没有预料到异常也是如此。

    来源:http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

    敲定

    finalize 方法在对象即将被垃圾回收时调用。这可以在它符合垃圾收集条件之后的任何时间。

    请注意,一个对象完全有可能永远不会被垃圾收集(因此永远不会调用finalize)。这可能发生在对象永远不符合 gc 条件(因为它在 JVM 的整个生命周期内都可以访问)或者在对象变得符合条件和 JVM 停止运行之间实际上没有运行垃圾收集时(这通常发生在简单的测试程序)。

    有一些方法可以告诉 JVM 在尚未调用它的对象上运行 finalize,但使用它们也不是一个好主意(该方法的保证也不是很强大)。

    如果您依靠finalize 来正确运行您的应用程序,那么您做错了什么。 finalize 应该用于清理(通常是非 Java)资源。 完全正确,因为 JVM 不保证在任何对象上都会调用 finalize

    来源:https://stackoverflow.com/a/2506509/1048340


    这是快速谷歌搜索的所有结果;在发布问题之前您应该这样做:P

    【讨论】:

      【解决方案4】:

      final关键字取决于你在哪里使用它:

      • public final class ...,你说这个类不能是超类(所以没有人可以继承它)。
      • public final String someField,这里你说String someField 不能改变(当然是在第一次初始化之后)。
      • public final myMethod() { ... },这里的方法不能在子类中被覆盖。

      finally 块用于让一些代码运行,与 try 是否捕获异常无关:

      try {
          Random rand = new Random();
          if (rand.nextInt(2) == 0) { throw new Exception(); }
          System.out.println("You'll get here 50% of the time (when no exception is thrown)");
      catch (Exception ex) {
          System.out.println("This should happen 50% of the time.");
      } finally {
          System.out.println("You will ALWAYS get here!");
      }
      

      finally 方法是这样的:protected void finalize(),这可以被父级 (@Override) 覆盖,如下所示:

      @Override
      protected void finalize() {
          System.out.println("Do something");
      }
      

      当垃圾收集决定删除对象时,应该运行 finalize 方法。然而,这只发生在没有对对象的引用时。然而,它有一些严重的缺点。只有当我将一些本机数据存储在必须释放的地方时,我才会使用它。但你可能几乎永远不会那样做。

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        java Final 关键字 可以在很多情况下使用。

        1. 变量 - 如果将任何变量设为最终变量,则无法更改最终变量的值(它将是常量)。
        2. 方法 - 如果您将任何方法设为最终方法,则无法覆盖它。
        3. 类 - 如果将任何类设为最终类,则不能扩展它。 read more

        最终块

        finally 块总是在 try 块退出时执行。这确保即使发生意外异常finally 块也会被执行。将 清理代码 放在 finally 块中始终是一个好习惯,即使在没有预料到异常的情况下也是如此。 read more

        finalize 方法 在java 中是一个特殊方法,很像java 中的main 方法。 finalize() 被调用在垃圾收集器之前回收对象,这是任何对象执行清理活动的最后机会

        java 中finalize 方法的主要问题是它JLS 不保证它会被垃圾收集器调用或准确调用它的时间,例如一个对象可能在成为有资格进行垃圾收集,并且在其 finalize() 方法被调用之前。同样,即使在 finalize 被调用后,也不能保证它会立即被收集。 read more

        【讨论】:

        • @atish_shimpi 感谢分享,但是其他最终确定的方法呢?
        猜你喜欢
        • 2011-12-10
        • 2019-03-15
        • 2015-02-19
        • 2013-09-24
        • 2021-09-09
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 2016-08-17
        相关资源
        最近更新 更多