web-dev-qa-db-ja.com

Javaでは、キーワード「final」、「finally」、「finalize」はどのような目的を果たしますか?

Javaでは、キーワードfinalfinally、およびfinalizeを実行する目的は何ですか?

82
Pat R Ellery

最後の

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ステートメントで コード「always」を実行 に使用されます

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

Java 7には new try with resourcesステートメント があり、明示的または暗黙的に実装するリソースを自動的に閉じるために使用できます Java.io.Closeable または Java.lang。 AutoCloseable

ファイナライズ

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

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}
269
krico
  • 「最終」は、何かを変更できないことを示します。通常、プログラムの全期間を通じて同じ値を保持する静的変数でこれを使用します。
  • 「最後に」は、try/catchブロックと組み合わせて使用​​されます。 「try」ブロック内のコードが例外をスローするかどうかに関係なく、「finally」句内のすべてが実行されます。
  • 「ファイナライズ」は、オブジェクトがガベージコレクションされる直前にJVMによって呼び出されます。
18
Kevin R

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

final –定数宣言。

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

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

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

6
Vorapsak

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

final int FILE_TYPE = 3;

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

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

最後に(笑)、finalize imがキーワードであることは完全にはわかりませんが、Objectクラスには finalize() 関数があります。

6
ctrlc-root

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

finally:finally is block。 finallyブロックは、tryブロックが終了すると常に実行されます。これにより、予期しない例外が発生した場合でも、finallyブロックが実行されます。しかし、最終的には単なる例外処理以上のことに役立ちます。これにより、プログラマは、クリーンアップコードが誤ってリターン、続行、またはブレークによってバイパスされることを回避できます。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。

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

6
venom

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

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

。Finalize•Finalizeは、適格なオブジェクトを収集してクリーンアップ処理を実行する直前に、ガーベッジコレクションスレッドによって呼び出されます。 •これはオブジェクトがクリーンアップを実行する最後のチャンスですが、finalize()が呼び出されるかどうかは保証されないため、呼び出しをファイナライズするまでリソースを保持するのは悪い習慣です。 •ファイナライズは方法です。

2
Mulalo Madida