最后一个关键字,最后一个块和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}
完成方法
当它被销毁时(通常是垃圾收集),它会在每个对象上调用它。
Final:-
用于以下情况:
- 如果final关键字附加到变量,则变量变为常量,即其值不能在程序中更改。
- 如果方法被标记为final,则该方法不能被任何其他方法覆盖。
- 如果一个类被标记为final,则该类不能被任何其他类inheritance。
- 如果参数标记为final,则它将成为只读参数。
Finally:-
如果在try块中抛出exception,则控件直接传递给catch块,而不执行try块的其余部分中写入的代码行。 如果出现exception,我们可能需要清理一些我们创建的对象。 如果我们在try块中进行清理,则在exception的情况下可能不会执行它们。 因此,最后使用了包含清理代码的块,并且总是在try … catch块之后执行。
Finalize:-
它是一个类中存在的方法,在垃圾收集器回收其任何对象之前调用该方法。 finalize()
方法用于在垃圾回收器回收对象之前执行代码清理。
最后
它用于以下三种情况:
- 如果final关键字附加到变量,则变量变为常量,即其值不能在程序中更改。
- 如果方法被标记为final,则该方法不能被任何其他方法覆盖。
- 如果一个类被标记为final,则该类不能被任何其他类inheritance。
来源: http : //www.go4expert.com/articles/final-finally-finalize-java-t28061/
最后
当try块退出时, finally
块总是执行。 这确保即使发生意外exception也会执行finally
块。 但finally
不仅仅是exception处理有用 – 它允许程序员避免因return
, continue
或break
意外绕过清理代码。 将清理代码放在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
,这里你说StringsomeField
无法更改(当然第一次初始化之后)。 -
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关键字可以在许多上下文中使用。
- 变量 – 如果将任何变量作为final,则不能更改final变量的值(它将是常量)。
- 方法 – 如果您将任何方法设为最终方法,则无法覆盖它。
- 类 – 如果您将任何类作为final,则无法扩展它。 阅读更多
终于阻止了
当try
块退出时, finally
块总是执行。 这确保即使发生意外exception也会执行finally
块。 将清理代码放在finally
块中总是一种很好的做法,即使没有预期的例外情况也是如此。 阅读更多
java中的finalize方法是一种特殊方法 ,与java中的main方法非常相似。 在垃圾收集器回收Object 之前调用finalize()
,它是任何对象执行清理活动的最后机会
java中的finalize
方法的主要问题是它不能保证JLS它将被垃圾收集器调用,或者它将被调用的时间 ,例如,一个对象在符合垃圾收集条件并且在其finalize()
方法获得之前可能无限期地等待调用。 同样,即使在finalize被称为无法保证后,它也会被立即收集。 阅读更多