finalキーワードのまず、基本的な使い方
1、修飾クラス
このクラスは継承することができないことを示す、最終のクラスを変更する場合。注意:最後のクラスのメンバ変数は、最終的な方法のすべてのメンバーに設定することができ、必要に応じて最終的なクラスは、暗黙のうちに、最終的な方法として指定されます。
2、修飾法
次の抜粋「Javaプログラミングのアイデア」第四版、143ページは:;第二の理由を「最終方法第一の理由を使用するための2つの理由がありますロック方法は、その意味を変更するために、任意の継承クラスを防ぐために、ということです。効率です。Java実装の以前のバージョンでは、最後のメソッド呼び出しに組み込まれます。しかし、この方法が大きすぎると、あなたはどんなパフォーマンス埋め込まれた呼び出しは無いのJavaの最新バージョンで持って表示されない場合があります最終的に最適化するために、これらのメソッドを使用します。」
明示的に禁止する方法は、唯一の方法は、最終的に覆われている例サブクラスで提供されたい、サブクラスで覆われていない、すなわち、最終的な親クラス。
この方法は、最終的な方法の変形例を表すには、「最後の、最終的な」意味、すなわち、この方法は、(S、最終的な修正方法をオーバーライドすることができる)を書き換えることはできませんされています。
(注意:プライベートクラスメソッドは暗黙のうちに、最終的な方法として指定。)
3、変更された変数
最終メンバー変数は定数を表し、割り当てられた値が変化しないの後、一度だけ割り当てられることができます。基本データ型の最終的な変更は、データベースの変更の種類を示す値が初期化後すぐに起こることができないとき。
参照型の最終的な変更は、それは、その他のオブジェクトをポイントした後、初期化が、変更が発生する可能性がオブジェクトへの参照点の内容を任せることはできない場合。
基準値は、アドレス、最終的な要求値であるので、本質的に同一のもの、すなわち、アドレスの値は変化しません。
メンバ変数(プロパティ)の最終変更が初期化された表示されなければなりません。初期化するには2つの方法があります宣言時に初期化されている変数は、第2の方法は、あなたが変数を宣言する時の初期値ではありませんが、この変数のコンストラクタクラスのすべてに、この変数に割り当てます初期値。
関数パラメータであることを示す、パラメータタイプは、最終的な宣言されると、読み取り専用タイプ。つまり、あなたが読むためには、このパラメータを使用できますが、パラメータの値を変更することはできません。
finalキーワードの第二に、深い理解
1、最後のクラス変数と共通の変数の違いは何ですか?
最終的なクラスのメンバ変数に適用した場合、メンバー変数は、(クラスメンバ変数、注意ローカル変数のみ使用前に初期化に割り当てられる必要がある)コンストラクタに割り当て、最終的な変数の時に定義または初期化されなければなりません割り当てが初期化されると、それはアップ割り当てることができません。
だから、どのような違い、それは最終的に、最終的な変数や共通の変数を作るのですか?次の例を参照してください。
パブリッククラスTest { パブリック静的な無効メイン(文字列[] args){ 列A = "hello2"。 最終列B =「こんにちは」。 列D = "こんにちは"; 列C = B + 2。 列E = D + 2。 System.out.println((==のc)参照)。 System.out.println((A == e)参照)。 } }
出力:真、偽
、あなたは最初の出力のこの質問について考えることができます。なぜ最初の比較が真であり、第2の比較はfasleです。最終的変数と通常の変数間の違いがあり、我々は、コンパイル時にその正確な値を知ることができれば、最終的な変数は、基本データ型と文字列型のときには、コンパイラは、コンパイル時定数として使用します。それは、最終的な変数の代わりに使用され、定数への直接アクセスの同等は、実行時に決定する必要はありません。
ただし、注意してくださいだけで、コンパイル時に、最終的な変数値の正確事例を知ることができ、コンパイラは、以下のコードが最適化されないので、この最適化を実行します。
パブリッククラスTest { パブリック静的な無効メイン(文字列[] args){ 列A = "hello2"。 最終列B = getHello()。 列C = B + 2。 System.out.println((==のc)参照)。 } 公共の静的な文字列getHello(){ 戻り「ハロー」。 } }
このコードの出力はfalseにあります。私たちが知っている変数bによってコンパイル時に値を知ることができ、データの一部が最終であることを考えてはいけない。ここで注意すべきポイントはこれです、ここでそれを初期化するgetHello()メソッドの使用は、彼が実行するために知りたいですその値。
そして、上記の例では、実行時に値を知っている必要はありませんが、同じではありません。
2、オブジェクト変数あなたの修正参照変数の内容の最終点?
最終の変数の後に、それは他のオブジェクトを指すことはできないが、修飾された、それはオブジェクトを指す内容は、可変です。
3、最後の引数を発行
実用的なアプリケーションでは、我々は、修飾された最後のメンバー変数、メンバ・メソッド、クラスに加えて使用することができ、パラメータはまた、改変され得るパラメータは、最終的に変更された場合、パラメータが変更されないことを意味します。