在Java中,关键字“ final”,“ finally”和“ finalize”的作用是什么?[关闭]


82

在Java中,目的是什么做的关键字finalfinallyfinalize履行?



12
它们甚至不是可比的概念。它们恰好是类似的拼写。做一些阅读。
马塞洛·坎托斯

3
他们之间没有任何关系-从概念上讲是完全无关的。分别研究每个。
Ed Staub,

7
由于这似乎是一个相对普遍的问题,因此不应关闭。
David Titarenco,

1
投票决定要重新开放,因为答案很好,这可能对登陆这里的用户有用。
akappa 2011年

Answers:


272

最后

final 可用于标记变量“不可更改”

private final String name = "foo";  //the reference name can never change

final 也可以使方法“不可替代”

public final String toString() {  return "NULL"; }

final也可以使类不是“可继承的”。即该类不能被子类化。

public final class finalClass {...}
public class classNotAllowed extends finalClass {...} // Not allowed

最后

finally在try / catch语句中用于“始终”执行代码

lock.lock();
try {
  //do stuff
} catch (SomeException se) {
  //handle se
} finally {
  lock.unlock(); //always executed, even if Exception or Error or se
}

Java 7有一个新的try with resources语句,可用于自动关闭显式或隐式实现java.io.Closeablejava.lang.AutoCloseable的资源。

定案

finalize当对象被垃圾回收时被调用。您很少需要覆盖它。一个例子:

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}

18
比大多数Java书籍更好的答案!
diaryfolio 2014年

3
谢谢。与其他被称为“专家”的人相比,该答案得到了很好的解释。
datnt

2
好的答案,但是finalize方法的签名是错误的。
Samarth Shah 2015年

注意:Object#finalize() Java 9(JDK-8165641)中不推荐使用该方法。
Slaw

19
  • “最终”表示某些内容无法更改。通常,您希望在静态变量上使用此变量,这些变量在程序的整个生命周期内都将具有相同的值。
  • “最后”与try / catch块结合使用。无论“ try”块中的代码是否引发异常,“ finally”子句中的所有内容都将执行。
  • JVM将在对象将要进行垃圾回收之前调用“完成”。

6

final关键字用于声明常量。

final int FILE_TYPE = 3;

在try catch语句中使用finally关键字来指定要执行的代码块,而不考虑抛出的异常。

try
{
  //stuff
}
catch(Exception e)
{
  //do stuff
}
finally
{
  //this is always run
}

最后(哈哈),finalize im不能完全确定是一个关键字,但是Object类中有一个finalize()函数。


6

http://allu.wordpress.com/2006/11/08/difference-between-final-finally-and-finalize/

最终–常量声明。

最终–最终try块总是在try块退出时执行,但System.exit(0)调用除外。这样可以确保即使发生意外异常,也可以执行finally块。但是,最后,它不仅对异常处理有用,它还使程序员避免因返回,继续或中断而意外跳过清理代码。将清理代码放在finally块中始终是一个好习惯,即使没有预期例外的情况。

finalize()–方法有助于垃圾回收。在垃圾回收器丢弃对象之前调用的一种方法,使它可以清理其状态。不应用于释放非内存资源,例如文件句柄,套接字,数据库连接等,因为Java仅具有有限数量的这些资源,并且您不知道何时垃圾回收将开始释放这些非内存资源通过finalize()方法。

您是否尝试过在Google上搜索,并且需要澄清以获取解释?


4
欢迎使用Stack Overflow!虽然本文实际上可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。堆栈溢出仅与其问题和答案一样有用,并且如果此博客主机出现故障或URL到处移动,则此答案将变得无用。谢谢!
sarnold 2011年

6

final: final是关键字。清除为final的变量只能初始化一次,并且不能更改。声明为final的Java类无法扩展。声明为final的方法不能被覆盖。

终于: 终于是一个障碍。try块退出时,finally块始终执行。这样可以确保即使发生意外异常,也可以执行finally块。但是,最后,它不仅对异常处理有用,它还使程序员避免因返回,继续或中断而意外跳过清理代码。将清理代码放在finally块中始终是一个好习惯,即使没有例外的情况也是如此。

finalize: finalize是一种方法。在对象被垃圾回收之前,运行时系统将调用其finalize()方法。您可以在获取垃圾之前用finalize()方法编写系统资源释放代码。


2

1. Final •Final用于对类,方法和变量施加限制。•不能继承final类,不能覆盖final方法,并且不能更改final变量值。•最终变量在创建时进行初始化,除非在构造函数中初始化的空白最终变量为空。•Final是关键字。

2.最终 •最终与try和catch一起用于异常处理。•无论是否处理异常都将执行。•此块用于关闭资源,如数据库连接,I / O资源。•最后是一个障碍。

3. Finalize •垃圾回收线程在收集合格对象进行清理处理之前调用Finalize。•这是对象执行任何清理的最后机会,但是由于不能保证是否调用finalize(),因此将资源保留到finalize调用是一种不好的做法。•Finalize是一种方法。


0

java中final的含义是:-应用于变量意味着一旦初始化就不能再修改相应的变量

private final double numer = 12;

如果您尝试修改此值,则会出现错误。

-应用于方法意味着不能覆盖相应的方法

 public final void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }

但是final方法可以被继承,因为final关键字限制了方法的重新定义。

-应用于类意味着不能扩展相应的类。

class Base
{

    public void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }
}

最后的含义是:

class TestFinallyBlock{  
  public static void main(String args[]){  
  try{  
   int data=25/5;  
   System.out.println(data);  
  }  
  catch(NullPointerException e){System.out.println(e);}  
  finally{System.out.println("finally block is always executed");}  
  System.out.println("rest of the code...");  
  }  
} 

在此示例中,即使不执行try-catch,final内部的内容也将始终执行。finalize的含义:

class FinalizeExample{  
public void finalize(){System.out.println("finalize called");}  
public static void main(String[] args){  
FinalizeExample f1=new FinalizeExample();  
FinalizeExample f2=new FinalizeExample();  
f1=null;  
f2=null;  
System.gc();  
}}  

在致电垃圾收集器之前。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.