Javaでfinalキーワードの深い理解

最終的にはJavaで重要なキーワードである、それは、クラス、メソッド、変数に使用することができます。この記事では、最終的なキーワードが何であるかを説明しますか?最終的に宣言された変数、メソッドやクラスが何を表していますか?最終使用の利点は何ですか?

どのような最後のキーがありますか?

最終的には、Javaの予約語である、あなたはメンバ変数、メソッド、クラス、およびローカル変数を宣言することができます。あなたは、変数を再初期化しようとした場合、あなたが最終となる基準を宣言したら、参照を変更することはできません、コンパイラは、コンパイラはコンパイルエラーを報告します、コードをチェックします。

最終的変数

任意のメンバ変数またはローカル変数(コード・ブロックまたはプロセス変数は、ローカル変数と呼ばれる)と呼ばれる最終の最終的な変数として宣言されています。最終的な静的変数は、多くの場合、定数として、キーワードと一緒に使用します。ここでは、最終的な変数の例です。

public static final String NAME = "wupx";
NAME = new String("wupx"); //invalid compilation error

最後の変数は読み取り専用です。

最後の方法

この方法はまた、使用の変更方法への最終的な修飾子でのJava、最終的に宣言することができる唯一の正しい表現である:このメソッドは、このメソッドは、現在、さらに最終により派生クラス(オーバーライド)でオーバーライドする宣言することはできませんが、もともと仮想方法でした。

Javaのアフリカのプライベートメンバメソッドは、デフォルトの仮想メソッドであり、仮想メソッドは、派生クラスでオーバーライドすることができます。派生クラスがさらに上書きされていないクラスの仮想メソッドを確保するためには、コンパイラ(たとえば、javacのような)JVMをチェックして、この制限は、常に真であることを確実にするために聞かせて、宣言するためにfinal修飾子を使用する必要があります。

ほとんど破るに対する答えのノウハウでビッグRの参照を以下のうわさ「最終修正方法と、この方法に速く呼び出しを許可」:

広く流通文は、最終的な修正方法は、このメソッドの呼び出しが速くなることができますされていました。現代の主流のJVMの最適化についての意見は(などのOracle JDK / OpenJDKのHotSpot VMの、IBM J9 VM、アズールシステムズジングVM、として)確立されていません。使用はあなたが仮想メソッドの呼び出しが唯一の可能なターゲットであるかを決定することができますので、避けられないが、そのバージョンに存在することはできませんオーバーライドするためのクラスを派生し、最終的な仮想メソッドを、修正、および、現時点では、この最後の修飾子を削除する場合:これがあるためでありますこれらは、この方法は、さらに派生クラスのバージョンで上書きしないことを見つけるために、高度なJVM「クラス階層分析」(クラス階層分析、CHA)を介して使用できますので、また、仮想メソッド呼び出しが唯一の可能なターゲットであるかを決定することができます。次いで、最適化の度合いの両方が、それは、の両方に由来する「不要とターゲット仮想ディスパッチによって直接呼び出すことができる」(「デブラ」と称する、devirtualization)または「コンビニエンスインライン」の外観の観点からかどうか、全く同じになります彼らは同じです。

元々はクラス階層の仮想メソッドが複数のバージョンを上書きする場合、これは、このような状況は、ポットもぼかしが困難になる続行されますが、そうしても、仮想メソッドに加えて、最終的な変更のためには不可能だっただろう背中に「役に立たないので、最終的な変更」を任せることはできません。

現代のJVMの主流を最適化する際に、最終的なキーワードを使用してパフォーマンスを向上させることはありません。

以下は、最終的な方法の例であります:

class User{
    public final String getName(){
        return "user:wupx";
    }
}

class Reader extends User{
    @Override
    public final String getName(){
        return "reader wupx"; //compilation error: overridden method is final
    }
}

finalクラス

、彼らは継承できません、最終的なクラスは、通常は完全に機能し、最終的に呼ばれるクラスのカテゴリを変更するために、最終的な使用、Javaは多くのクラスは、文字列、Intergerや他の包装など、最終的なものであります。以下は、最終的なクラスの例を示します。

final class User{

}

class Reader extends User{  //compilation error: cannot inherit from final class

}

最後のメモリモデル

最後の変数のために、コンパイラおよびプロセッサ並べ替えが二つの規則を遵守しなければなりません。

  • コンストラクタ内で、これら二つの動作の間に再配列しない、変数に割り当てられ、この構成参照オブジェクトに、最終的な変数を書き込むこと、および
  • オブジェクトは、最終的な変数の最初の読み取りを含み、2つの操作の間に再配列しない、最初の時間変数の最終の読み取り

実際にはこれら2つのルールがどのような書き込みと、最終的な変数のための読書です。並べ替えルールを書く前のスレッドのいずれかへの参照が表示されて、最終的に変数オブジェクトが正しく初期化されていることを保証し、通常の変数がオブジェクトにこの保証を持つことはできません。オブジェクトのfinal変数を読む前に、それを保証することができます並べ替えのルールを読んで最初にこのオブジェクトを読み込みます。あなたは引用符が空でない読めば、上記の規則、命令、および特定の初期化の最後の変数オブジェクトに応じて書くあなたは正しい変数の値を読み取ることができますので、完了です。

最終的な変数の型は、オブジェクトコンストラクタ外部参照型、次いで、コンストラクタ関数、ドメインのメンバーによって参照されるオブジェクトに対する最終書き込み、その後、これは構成で参照される変数代入を参照し、二つの操作である場合並べ替えができない間。

実際には、他のスレッドから見える前に最終的な変数を確保するために初期化を修正することができる完了する。

メリットfinalキーワード

ここでは、最終的なキーワードを使用していくつかの利点は次のとおりです。

  • finalキーワードパフォーマンスの向上、JVMおよびJavaアプリケーションがキャッシュされ、最終的な変数
  • 最後の変数は、安全に、追加の同期化のオーバーヘッドを必要とせずに、マルチスレッド環境で共有することができます

概要

  • 最後のキーワードは、メンバ変数、ローカル変数、メソッドやクラスのために使用することができます
  • 最後のメンバ変数は、それ以外の場合は、コンパイル・エラーが報告、初期化したり、それが宣言されたコンストラクタで初期化する必要があります
  • 最後の変数のために再度割り当てることはできません
  • ローカル変数は、宣言の時に割り当てる必要があります
  • すべての変数で匿名クラスでは、最終的な変数である必要があります
  • 最終的な方法をオーバーライドすることはできません
  • finalクラスは継承できません
  • インタフェース自体で宣言されたすべての変数は最終的なもので
  • 最終的な両方のキーワードが反比例している抽象、finalクラスの抽象することはできません
  • ブランクのfinal変数(空白のfinal変数)に呼び出さ初期化されていない変数の最終宣言は、彼らはコンストラクタで初期化されなければならない、またはこの()の初期化を呼び出すことによって、これをしないと、コンパイラは、最終的な変数(変数名)の必要性を訴えるだろう初期化
  • Javaコードの規約によると、最後の変数が一定であり、かつ大文字に通常の定数名
  • finalとして宣言されたオブジェクトのコレクションのための参照を変更することはできないことを意味

参照

「Javaプログラミングのアイデア」

https://www.zhihu.com/question/66083114

ファイル

おすすめ

転載: www.cnblogs.com/wupeixuan/p/11750053.html