ファイナル、ファイナル、ファイナライズの違いについて話します

1.決勝 

  Javaでは、finalを使用して、クラス、メソッド、および変数(メンバー変数またはローカル変数)を変更できます。以下、詳細に説明する。

1.1変更クラス

  クラスがfinalで変更された場合、そのクラスを他のクラスに継承できないことを示します。クラスを継承しないようにする必要がある場合は、この時点で最終変更を使用できますが、次の点に注意する必要があります。

最終クラスのすべてのメンバーメソッドは、暗黙的に最終メソッドとして定義されます。

1.2修正方法

最終的な方法を使用する主な理由は2つあります。

  (1)メソッドをロックして、継承されたクラスがメソッドを変更しないようにします。

  (2)効率性。初期のJavaバージョンでは、finalメソッドはインライン呼び出しに変換されます。ただし、メソッドが大きすぎると、パフォーマンスがあまり向上しない可能性があります。したがって、最近のバージョンでは、これらの最適化に最終的な方法は必要ありません。

最終メソッドは「最後の最終」を意味します。つまり、このメソッドをオーバーライドすることはできません。

注:親クラスのfinalメソッドのアクセス許可がprivateの場合、そのメソッドをサブクラスに直接継承することはできません。そのため、現時点では、同じメソッド名の関数をサブクラスに定義できます。オーバーライドする最終的な矛盾と同じですが、サブクラスの新しいメソッドを再定義します。

コードをコピーする

クラスA { 
    private final void getName(){ 

    } 
} 

public class B extends A { 
    public void getName(){ 

    } 

    public static void main(String [] args){ 
        System.out.println( "OK"); 
    } 
}

コードをコピーする

  

1.3変更された変数

   最後のメンバー変数は定数を表し、一度だけ割り当てることができ、その値は割り当て後に変更されません。C ++のconstに似ています。

  finalが基本データ型を変更する場合、基本データ型の値は初期化後に変更できないことを意味します。finalが参照型を変更すると、初期化後に他のオブジェクトを指すことはできなくなりますが、オブジェクトのコンテンツは参照により変更することができます。参照される値はアドレスであり、finalには値が必要であるため、これは基本的に同じです。つまり、アドレスの値は変更されません。 

  Finalは、表示および初期化する必要があるメンバー変数(属性)を変更します。2つの初期化メソッドがあります。1つは変数が宣言されたときに初期化する方法です。2つ目のメソッドは変数を宣言するときに初期値を割り当てないで、変数が配置されているクラスのすべてのコンストラクターにこの変数を割り当てます。初期値。

 

  関数のパラメーター型がfinalとして宣言されている場合、それはパラメーターが読み取り専用であることを意味します。つまり、パラメーターを読み取って使用することはできますが、パラメーターの値を変更することはできません。

 

   

 

  Javaでは、Stringは最終クラスとして設計されていますが、通常の使用でStringの値を変更できるのはなぜですか?

  文字列定数プールは、Javaヒープメモリ内の特別なストレージ領域です。文字列オブジェクトを作成するとき、文字列が定数プールに存在しないと仮定して作成し、存在する場合は、を直接参照します。既存の文字列。String a = "A"; a = "B"などのStringオブジェクトの値を変更する場合。aはStringオブジェクトへの参照です(ここで説明しているStringオブジェクトは実際には文字列定数を参照しています)。a= "B"が実行されると、元のStringオブジェクト( "A")は変更されませんが、新しい1つは作成されたオブジェクト( "B")です。参照してみましょう。

2.最後に

   最後に、例外処理の一部として、try / catchステートメントでのみ使用でき、ステートメントブロックが添付されます。これは、このステートメントが最終的に実行されることを意味し(例外がスローされるかどうかに関係なく)、頻繁に使用されます。リソースを解放する必要がある場合。ケース。(×)(この文には実際に特定の問題があります)

  多くの人がfinallyブロックが実行されると思いますが、これは本当ですか?次の例のように、答えはノーです。

  

 

  コメント付きの3行のステートメントを削除すると、実行結果は次のようになります。

  

   上記の2つのケースでfinallyステートメントが実行されないのはなぜですか?問題は何ですか?

  finishに対応するtryステートメントブロックが実行された場合にのみ、finallyステートメントブロックが実行されます。上記の2つのケースでは、tryステートメントブロックが実行される前に例外が返されるかスローされたため、tryに対応するfinallyステートメントは実行されません。

  ただし、tryステートメントを実行してもfinallyステートメントが実行されない場合があります。例えば:

  

  finallyブロックはまだ実行されていません、なぜですか?tryブロックでSystem.exit(0)ステートメントを実行したため、Java仮想マシンは終了しました。System.exit(0)メソッドは基本的に一般的なJavaアプリケーションでは呼び出されないと誰かが言った。OK!問題ありません。System.exit(0)メソッドを呼び出さない場合、finallyブロックは実行されますか?

  みんなをもう一度失望させてください、答えはまだノーです。tryブロックまたはcatchブロックの実行中にスレッドが中断または終了すると、対応するfinallyブロックが実行されない場合があります。より極端な状況があります。つまり、スレッドがtryブロックまたはcatchブロックを実行しているときに、突然クラッシュするか、電力が失われ、finallyブロックが確実に実行されないということです。クラッシュや停電などの理由は少し不合理だと思う人もいるかもしれませんが、それは問題ではありません。問題を説明するだけです。

 

エラーを起こしやすい

  try-catch-finallyステートメントでreturnステートメントを実行します。次のコードを確認します。

  

  回答:4、4、4。どうして?

  まず、finallyステートメントが変更されたコードで実行されます。実行結果から、他のreturnステートメントがブロックされているかのように、各returnの結果は4(つまり、finallyステートメント)になります。

  事実は真実です。finallyの使用法は特別であるため、前のreturnステートメントはキャンセルされ、最後のfinallyブロックのコードは引き続き実行されます。 

  

3.ファイナライズ  

  finalize()はjava.lang.Objectで定義されています。つまり、すべてのオブジェクトにそのようなメソッドがあります。このメソッドは、gcが開始され、オブジェクトがリサイクルされるときに呼び出されます。実際、gcはほとんどのオブジェクトをリサイクルできます(新しいオブジェクトはgcで処理できます。通常、オブジェクトの作成にnew以外のメソッドは使用しません)。したがって、プログラマーは通常、finalizeを実装する必要はありません。 
特別な場合、プログラマーはファイナライズを実装する必要があります。オブジェクトがリサイクルされると、一部のリソースが解放されます。たとえば、オブジェクトが初期化されるときにソケットリンクが作成され、ライフサイクル全体で有効になります。次に、ファイナライズとを実装する必要があります。リンクを閉じます。 
  finalizeを使用するときに注意すべきもう1つのことは、super.finalize()を呼び出すことです。

  オブジェクトのfinalize()メソッドは1回だけ呼び出され、finalize()が呼び出されても、gcがオブジェクトをすぐに再利用するわけではないため、finalize()が呼び出された後、オブジェクトが呼び出す必要がない可能性があります。再利用された後、実際にリサイクルされる場合、以前に一度呼び出されたため、finalize()は呼び出されず、問題が発生します。したがって、デストラクタとは異なるfinalize()メソッドを使用しないことをお勧めします。

おすすめ

転載: blog.csdn.net/A___B___C/article/details/114029246