修飾子finalの浅い分析


JAvaの修飾子finalは、クラス、メソッド、ドメインにそれぞれ作用します.
finalクラス.クラスを定義するときにfinal修飾子を付けると、クラスはかなり完備しており、他のクラスに継承されなくてもよいことを示します.つまり、javaの継承ツリー構造ではリーフノードです.クラスがfinalクラスである場合、そのクラスのすべてのメソッドは自動的にfinalメソッドになります.メソッドの前に修飾子finalを付けるかどうかにかかわらず.このクラスのドメインはfinalを加えてfinal変数として宣言してもよいし、追加せずに一般変数として宣言してもよい.クラスがfinalクラスであるかどうかは、クラスのドメインに影響を与えません.
finalメソッド.メソッドに修飾子finalを付けると、メソッドをfinalメソッドとして宣言できます.finalメソッドの役割は2つあります.1つは、メソッドがクラスに上書きされたり書き換えられないようにすることです.二つ目は,コンパイラにこの方法の呼び出し方式をインライン呼び出し方式に変更し,実行効率を向上させることを提示する.注意しなければならないのはfinalメソッドのメソッドボディが大きい場合、これは最終コードのボリュームを大幅に増加させるため、使用するときは両者の利害を比較しなければならない.
finalドメイン.finalドメインは、いったん値を割り当てると永遠に変わらないので、定数を定義するのに適しています.finalドメインが基本タイプである場合、ドメイン変更の値は変更できないことに注意してください.finalドメインがオブジェクトの参照である場合、変更参照は変更できない、すなわち永遠に同じオブジェクトを指すことを示すだけで、参照されるオブジェクト自体は変更できます.これはc++の定数ポインタに似ています(定数を指すポインタではありません).finalドメインの初期化には特殊な要求があります.非静的finalドメインは、コンストラクション関数の実行後に明確に値を付けなければなりませんが、静的finalドメインはクラスの初期化が完了した後に明確に値を付けなければなりません.次の例を参照してください.
class Parent{
    final int i; //blank final
    final int j = 10;
    static final int k;  //static blank final
    static final int l = 20;
    int z = 11;

     static{
          k = 15;
     }
 
     Parent(){
         i = 5;
     }
     /*    instance initializer
     {
         i = 5;
     }*/
}
特にstatic finalドメインの場合、javaのコンパイラは、定数に対するローカルコピーを直接解析し、参照者クラスの定数プールまたはバイトコードストリームに配置する特殊な処理を行う.参照者クラスがこのデータを使用すると、ドメインを変更したクラスのclassファイルからデータを取得することなく、本クラスのclassファイルの定数プールまたはバイトコードで直接取得されます.
finalパラメータ.c++のプログラマーは、以下の方法の宣言は、Parentオブジェクトが変更できないことを示すのではなく、変更参照が変更できないことを示すだけであることに注意してください.Javaのfinalクラスをc++のconstキーワードに直接比べると間違っています.

public void use(final Parent p){
      p.z = 15; //correct
      //p = new Parent(); error
}
   
実際には、finalドメインで説明されているように、定数を指すポインタではなく、c++の定数ポインタに似ています.
reference:
The Final Word On the final Keyword 
http://renaud.waldura.com/doc/java/final-keyword.shtml