JavaでのFinal、Finally、およびFinalizeの違い
コンテンツ
「final、finally、and finalize」という言葉はJavaの短所にあります。それらのそれぞれに異なる機能が提供されます。 final、finally、finalizeの基本的な違いは、 最後の アクセス修飾子です。 最後に ブロックであり、 ファイナライズ オブジェクトクラスのメソッドです。 final、finally、およびfinalizeには、比較チャートで説明されている他のいくつかの違いがあります。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | 最後の | 最後に | ファイナライズ |
---|---|---|---|
ベーシック | Finalは、Javaの「キーワード」および「アクセス修飾子」です。 | 最後は、Javaの「ブロック」です。 | FinalizeはJavaの「メソッド」です。 |
該当する | Finalは、クラス、変数、およびメソッドに適用されるキーワードです。 | 最後は、常にtry and catchブロックに関連付けられているブロックです。 | finalize()は、オブジェクトに適用可能なメソッドです。 |
ワーキング | (1)最終変数は定数になり、再割り当てできません。 (2)finalメソッドは、子クラスによってオーバーライドできません。 (3)最終クラスは延長できません。 | 「最終」ブロック。「try」ブロックで使用されているリソースをクリーンアップします。 | Finalizeメソッドは、オブジェクトを破棄する前に、オブジェクトに関連するクリーンアップアクティビティを実行します。 |
実行 | 最終メソッドは、呼び出し時に実行されます。 | 「最後に」ブロックは、「try-catch」ブロックの実行直後に実行されます。 | finalize()メソッドは、オブジェクトが破棄される直前に実行されます。 |
最終の定義
「最終」はJavaのキーワードです。これはアクセス修飾子です。 「final」キーワードは、クラス、メソッド、および変数に適用されます。それらがそれぞれどのように機能するかを見てみましょう。
最終変数
- 最終キーワードが変数に適用されると、それ以上変更することはできません。
- 最終変数は、宣言時に初期化する必要があります。
- 一般的なコーディング規則では、最終変数は大文字で宣言されます。
- 最後の変数は、インスタンスごとにメモリを占有しません。
最終的な方法
- クラス内のメソッドがfinalとして宣言されている場合、そのサブクラスによってオーバーライドすることはできません。
- finalとして宣言されている小さなメソッドは、コンパイラーによって「インライン」にすることができます。これにより、関数呼び出しのオーバーヘッドが削減され、パフォーマンスが向上します。
- オーバーライドされたメソッド呼び出しは動的に解決されますが、メソッドがfinalとして宣言されている場合、オーバーライドすることはできません。したがって、関数呼び出しはコンパイル時に解決できます。
クラスA {final void meth(){System.out.ln( "これはfinalメソッドです。"); }}クラスBはAを拡張します{void meth(){//クラスBはクラスAのメソッドを継承できません。System.out.ln( "Does not override"); }}
最終クラス
- クラスがfinalとして宣言されると、どのサブクラスからも継承できません。
- クラスをfinalとして宣言すると、そのすべてのメソッドが自動的にfinalとして宣言されます。
- クラスを「抽象」と「最終」の両方として宣言することはできません。
final class A {// ...} class B extends A {// Class Bは継承できませんclass A // ...}
- Javaでは、「最終的に」ブロックは常にtry / catchブロックに関連付けられます。
- 「最終」ブロックは、try / catchブロックの後、try / catchブロックに続くコードの前に実行されます。
- 「最終」ブロックは、例外がスローされたかどうかに関係なく実行されます。
- 例外がスローされ、そのキャッチに一致するcatchブロックがない場合、「最終」ブロックが実行されます。
- メソッドがキャッチされない例外または明示的なreturnステートメントを介してtry / catchブロック内から呼び出し元に戻ると、メソッドが呼び出し元に戻る直前に「最終」ブロックが実行されます。
- 「finally」ブロックは、「try」ブロックで使用されたリソースをクリーンアップするか、メモリを解放するために使用されます。
- 「finally」ブロックはオプションですが、try / catchブロックの後にfinallyブロックを記述することをお勧めします。
class finallyExample {//このメソッドは、メソッドから例外をスローします。 static void procA(){try {System.out.ln( "inside procA");新しいRuntimeException( "demo")をスローします。 } finally {System.out.ln( "procAs finally"); }} // tryブロック内から戻ります。 static void procB(){try {System.out.ln( "inside procB");戻り; } finally {System.out.ln( "procBs finally"); }} // tryブロックを通常どおり実行します。 static void procC(){try {System.out.ln( "inside procC"); } finally {System.out.ln( "procCs finally"); }} public static void main(String args){try {procA(); } catch(例外e){System.out.ln( "Exception caught"); } procB(); procC(); }} // procA内の出力procAのfinally procB内でキャッチされた例外procBがついにprocC内にprocCがついに
ファイナライズの定義
- Finalizeは、オブジェクトクラスのメソッドです。
- オブジェクトは、ファイルハンドルなどの非Javaリソースを保持している場合があります。破棄する前に解放する必要があります。
- このメソッドは、オブジェクトを完全に破棄する前にガベージコレクターによって呼び出されます。
- このメソッドは、オブジェクトが破棄される前にオブジェクトのクリーンアップアクティビティを実行します。
メソッドfinalize()の一般的な形式は次のとおりです。
protected void finalize(){//ここにファイナライズコード}
finalizeメソッドはprotectedとして宣言されているため、クラスの外部からアクセスすることはできません。
このメソッドは、ガベージコレクションの前に常に呼び出されます。
- キーワードfinalはアクセス修飾子、finallyはブロック、finalizeはメソッドです。
- キーワードfinalは、クラス、変数、クラスのメソッドに適用され、finallyは例外の処理に使用されるtry catchブロックに関連付けられたブロックです。finalizeはオブジェクトのみで動作するメソッドです。
- finalとして宣言された変数は定数になり、再割り当てできません。finalとして宣言されたメソッドはオーバーライドできず、finalとして宣言されたクラスは継承できません。 finallyブロックは、try and catchブロックで使用されるリソースをクリーンアップするために使用されます。 finalizeメソッドは、オブジェクトが破棄される前にオブジェクトが使用するリソースをクリーンアップするために使用されます。
結論:
Final、finally、およびfinalizeは、メソッドに適用されると異なる効果があります。