最后一个关键字,最后一个块和java中的最终方法之间的区别通过一个很好的例子

这些关键词经常让我困惑。

谁能告诉我他们到底有什么区别?

最终关键字

在课堂上它意味着你禁止有一个扩展你的子课程。

 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无关,它在捕获Exception时使用,以确保在没有exception的情况下运行部分代码。

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

最后在Java中


完成方法

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

Final:-用于以下情况:

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

Finally:-

如果在try块中抛出exception,则控件直接传递给catch块,而不执行try块的其余部分中写入的代码行。 如果出现exception,我们可能需要清理一些我们创建的对象。 如果我们在try块中进行清理,则在exception的情况下可能不会执行它们。 因此,最后使用了包含清理代码的块,并且总是在try … catch块之后执行。

Finalize:-

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

最后

它用于以下三种情况:

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

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

最后

当try块退出时, finally块总是执行。 这确保即使发生意外exception也会执行finally块。 但finally不仅仅是exception处理有用 – 它允许程序员避免因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


这是Google快速搜索的结果; 在发布问题之前你应该做的事情:P

final关键字取决于您使用它的位置:

  • public final class ... ,在这里你说这个类不能是超类(所以没有人可以inheritance这个)。
  • public final String someField ,这里你说String someField无法更改(当然第一次初始化之后)。
  • public final myMethod() { ... } ,这里的方法不能在子类中重写。

finally块用于获取一些代码,无论try是否捕获exception,都无关紧要:

 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 ,如下所示:

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

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

希望这可以帮助。

java Final关键字可以在许多上下文中使用。

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

终于阻止了

try块退出时, finally块总是执行。 这确保即使发生意外exception也会执行finally块。 将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。 阅读更多

java中的finalize方法是一种特殊方法 ,与java中的main方法非常相似。 在垃圾收集器回收Object 之前调用finalize() ,它是任何对象执行清理活动的最后机会

java中的finalize方法的主要问题是它不能保证JLS它将被垃圾收集器调用,或者它将被调用的时间 ,例如,一个对象在符合垃圾收集条件并且在其finalize()方法获得之前可能无限期地等待调用。 同样,即使在finalize被称为无法保证后,它也会被立即收集。 阅读更多