Javaのfinalキーワード「のJavaの基礎」:ブロックの継承とポリモーフィズム

Javaでは、変数およびメソッドは、キーワードを使用して、最終的な改変され得るクラス宣言、。「終了」を示す特徴的な「終了状態」を有する最終的な変更されたデータを意味します。次のように具体的な規定は以下のとおりです。

  • 最終修正クラスは継承できません。
  • メソッドの最後の変更は、サブクラスでオーバーライドすることはできません。
  • 最終変性変数(メンバ変数またはローカル変数)が一定になる、それは一度だけ割り当てられることができます。
  • 文の現時点では割り当て、唯一のチャンスの後、譲渡し、使用する前に、コンストラクタで明示的な割り当てが存在しない場合、最終的なメンバ変数は、声明の中でその割り当てを変更する必要があります。
  • 最終的な修飾ローカル変数は、値だけなしで宣言され、その後、ワンタイム割り当てすることができます。


これらの機能、データ値を修正するための最終的な汎用性、またはモードは任意の数学的な三角測量法、指数関数の方法などを行う、例えば、誤用を避けるために、変更することができない、数学的π定数= 3.141593、E = 2.71828のように。

実際には、また、最終のように定義されてjava.lang.Mathに、上述したクラスおよび定数の方法を提供し、その最終的な状態を確保します。

なお、参照型(任意の型のクラス)変数は、最終マーク場合、その変数は、他のオブジェクトを指し示すことができません。唯一の参照自体が最終であるので、しかし、あなたは、オブジェクトの内容を変更することができます。

変数は、それが一定にするの結果として、最終的にマークされている場合。コンパイルエラーになります最終変数の値を変更したいです。ここで適切に定義された最終的な変数の例です。

1公共最終int型のMAX_ARRAY_SIZE = 25; //一般的に一定の資本

そのため、一定の最終修正のために、それを継承することはできません。

次のコードを考えてみます。

パブリック 最終 クラスデモ{
     パブリック 静的 最終 int型 TOTAL_NUMBER = 5 ;
     公共 int型ID、
     パブリックデモ(){
         // 不正は、二次変数TOTAL_NUMBERの最終的な評価のため
         // ++ TOTAL_NUMBER TOTAL_NUMBERは+ = 1 TOTAL_NUMBER対応するため 
        = IDを++ TOTAL_NUMBER; 
    } 
    パブリック 静的 ボイドメイン(文字列[]引数){
         最終デモT = 新しい新しいデモ();
         最終 int型 I = 10 ;
         最終 INT J。
        J = 20である; 
        J = 30;   // 不正、最終的な二次変数割り当てのため
    } 
}

最終的なクラスはまた、(classキーワードの前に)変更するために使用することができ、java.lang.Stringでは、最終的なクラスであるような、この種の別の予想外のサブカテゴリーを送信防ぎます。文字列への参照がある場合、あなたはStringクラスの文字列ではなく、文字列の他のいくつかのタイプ(Stringクラスが継承され、改ざん、悪意のあるすることができる)でなければならないことを保証するために、これは、セキュリティ上の理由のために行われます。

この方法はまた、修飾された最終的な方法を上書きすることができず、最終的な変形であることができる;最終変数も変更最終変数は、その値がオブジェクトを作成するために、将来的に許可されていない変更、修正することができます。クラスはfinalとして宣言されたら、クラスを含む方法にも暗黙的変数をfinalとして宣言ではなくなります。

最後の方法は、静的結合、無多型(結合ダイナミック)変更され、実行時に再検索方法テーブルを必要としない、コード効率を向上させることができます。動的結合は意味がないので、Javaでは、修正またはプライベート静的メソッドは暗黙のうちに、finalとして宣言されています。

動的バインディングに時間とリソースを大量に消費されますする必要はありませんので、いくつかのプログラマが考えてあります。すべてのメソッドは最終的なものであり多型を使用するのに十分な理由がある、または変更する必要がある場合を除きます。

リアルタイム情報の監視プログラムが可能なJVMランタイム・コンパイラは、クラスのノウハウとの間の正確な関係を継承することができますので、そのような知識は、やや極端です。この方法は、被覆されておらず、それが短い場合は、コンパイラ最適化プロセスのために可能であり、このプロセスは、インライン(インライン)と呼ばれます。例えば、インライン呼び出しe.getName()アクセスe.name変数に置き換えられます。これは、命令のメソッドを呼び出すと、分岐が戦略プリフェッチ命令の使用を破壊する一方でCPUに、非常に重要な改善であるので、これは望ましくないと考えられます。getName()は別のクラスで覆われている場合は、コンパイラが動作します、したがって、それはインラインで処理することはできませんどのようなコードカバレッジを行うには知ることができません。

参考:https://www.cnblogs.com/Coda/p/4423592.html

 

おすすめ

転載: www.cnblogs.com/jssj/p/11372582.html