Javaでは、キーワード「final」、「finally」、「finalize」はどのような目的で使用されますか?[閉まっている]


82

Javaでは、どのような目的は、キーワードを行いfinalfinallyそしてfinalize満たしますか?



12
それらは同等の概念でさえありません。それらはたまたま同じように綴られています。いくつか読んでください。
マルセロカントス2011年

3
それらは互いに何の関係もありません-概念的には完全に無関係です。それぞれを別々に勉強してください。
Ed Staub 2011年

7
比較的一般的な質問であると思われるため、これを閉じるべきではありません。
David Titarenco 2011年

1
ここに着陸したユーザーにとって役立つかもしれない良い答えのために再開することに投票しました。
akappa 2011年

回答:


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には、java.io.Closeableまたはjava.lang.AutoCloseableを明示的または暗黙的に実装するリソースを自動的に閉じるために使用できる新しいtry withresourcesステートメントがあります。

ファイナライズ

finalizeオブジェクトがガベージコレクションされるときに呼び出されます。オーバーライドする必要はめったにありません。例:

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

18
ほとんどのJava本よりも良い答えです!!
diaryfolio 2014年

3
ありがとうございました。この答えは、彼ら自身を「専門家」と呼ぶ他の人と比較してよく説明されています。
datnt 2014

2
良い答えですが、finalizeメソッドの署名が間違っています。
Samarth Shah 2015

注:このObject#finalize()メソッドは、Java 9(JDK-8165641)で非推奨になりました。
コールスロー

19
  • 「最終」は、何かを変更できないことを意味します。通常、これは、プログラムの存続期間を通じて同じ値を保持する静的変数で使用する必要があります。
  • 「Finally」は、try / catchブロックと組み合わせて使用​​されます。'try'ブロックのコードが例外をスローするかどうかに関係なく、「finally」句内のすべてが実行されます。
  • 「Finalize」は、オブジェクトがガベージコレクションされる前にJVMによって呼び出されます。

6

最後のキーワードは、定数を宣言するために使用されます。

final int FILE_TYPE = 3;

finalキーワードは、try catchステートメントで使用され、スローされた例外に関係なく実行するコードのブロックを指定します。

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/

最終–定数宣言。

finish – finalブロックは、System.exit(0)呼び出しを除いて、tryブロックが終了すると常に実行されます。これにより、予期しない例外が発生した場合でも、finallyブロックが確実に実行されます。しかし、最後に、例外処理だけでなく、プログラマーがリターン、続行、または中断によって誤ってクリーンアップコードをバイパスすることを回避できるので便利です。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。

finalize()–メソッドはガベージコレクションに役立ちます。オブジェクトがガベージコレクターによって破棄される前に呼び出され、その状態をクリーンアップできるようにするメソッド。Javaにはこれらのリソースの数が限られており、ガベージコレクションがこれらの非メモリリソースを解放するためにいつ開始されるかわからないため、ファイルハンドル、ソケット、データベース接続などの非メモリリソースを解放するために使用しないでください。 finalize()メソッドを介して。

グーグルで検索してみましたが、説明のために説明が必要ですか?


4
Stack Overflowへようこそ!この記事は実際に質問に答えるかもしれませんが、ここに答えの本質的な部分を含め、参照用のリンクを提供することが望ましいでしょう。Stack Overflowは、その質問と回答と同じくらい有用であり、このブログホストがダウンしたり、URLが移動したりすると、この回答は役に立たなくなります。ありがとう!
sarnold 2011年

6

final: finalはキーワードです。finalとしてクリアされた変数は、一度だけ初期化する必要があり、変更することはできません。finalとして宣言されたJavaクラスは拡張できません。finalとして宣言されたメソッドはオーバーライドできません。

最後に: 最後にブロックです。finalブロックは、tryブロックが終了すると常に実行されます。これにより、予期しない例外が発生した場合でも、finallyブロックが確実に実行されます。しかし、最後に、例外処理だけでなく、プログラマーがリターン、続行、または中断によって誤ってクリーンアップコードをバイパスすることを回避できるようにします。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。

finalize: finalizeはメソッドです。オブジェクトがガベージコレクションされる前に、ランタイムシステムはfinalize()メソッドを呼び出します。ガベージコレクションを取得する前に、finalize()メソッドでシステムリソースリリースコードを記述できます。


2

1. Final •Finalは、クラス、メソッド、および変数に制限を適用するために使用されます。•finalクラスを継承したり、finalメソッドをオーバーライドしたり、final変数の値を変更したりすることはできません。•コンストラクターで初期化される空白の最終変数の場合を除いて、最終変数は作成時に初期化されます。•Finalはキーワードです。

2.最後に •最後に、tryとcatchとともに例外処理に使用されます。•例外が処理されるかどうかに関係なく実行されます。•このブロックは、データベース接続、I / Oリソースなどのリソースを閉じるために使用されます。•最後はブロックです。

3.ファイナライズ •ファイナライズは、クリーンアップ処理を実行するために適格なオブジェクトを収集する直前に、ガベージコレクションスレッドによって呼び出されます。•これは、オブジェクトがクリーンアップを実行する最後のチャンスですが、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が実行されているかどうかに関係なく、finallyの内部にあるものが常に実行されます。ファイナライズの意味:

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();  
}}  

ガベージコレクターを呼び出す前に。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.