【Javaプログラミング】Javaキーワードfinal使用詳細


プログラムコンテキスト環境によって、Javaキーワードfinalには「変更できない」または「最終状態」という意味があり、非抽象クラス、非抽象クラスメンバーメソッド、変数を修飾できます.2つの理解から変更を阻止する必要があるかもしれません:設計または効率.
  • finalクラスは継承できません.サブクラスはありません.finalクラスのメソッドはデフォルトでfinalです.
  • finalメソッドは布団類のメソッドで上書きできませんが、継承できます.
  • finalメンバー変数は定数を表し、1回のみ付与され、付与後の値は変更されません.
  • finalは、構造方法を修飾するために使用できません.

  • 注意:親クラスのprivateメンバーメソッドはクラスメソッドで上書きできないため、privateタイプのメソッドのデフォルトはfinalタイプです.
    1、finalデータ:
  • 変わらないコンパイル時定数.
  • 実行時に初期化された値で、その後は変更できません.
  • staticでfinalのドメインです.変更できないストレージスペースです.

  • finalタイプはデータに適用されます.
  • 基本データ型(int、double、char...)finalを運用する場合、数値を一定にします.
  • オブジェクト参照finalを運用する場合、finalは参照を一定にし、参照内部のデータはfinal型でなければ修正することができる.
  • 配列タイプfinalを運用する場合、finalは配列参照を一定にし、配列内部のデータはfinal型でなければ修正することができる.

  • 义齿
  • finalはデータが定数であることを示し、一定では修正できない.
  • staticは、データが1つの記憶領域のみを占有することを示す.

  • テストケース:
    public class FinalData {
    	private final int valueOne = 3;
    	private int valueTwo = 4;
    	private final Value v1 = new Value(4);
    	private Value v2 = new Value(10);
    	private final int[] a = {1,2,3,4,5,6,7,8,9};
    	private int[] b = {1,2,3,4,5,6,7,8,9};
    	private static final int VAL_TWO = 3;
    	
    	public static void main(String[] args) {
    		FinalData finalData = new FinalData();
    		/*-----------      ------------------------------------*/
    //		finalData.valueOne = 4;//valueOne   ,    
    		finalData.valueTwo = 14;//valueTwo    ,    
    		
    		/*-----------      ------------------------------------*/
    //		finalData.v1 = new Value(5);//v1   final   ,         。
    		finalData.v2 = new Value(20);//v2  final   ,       。
    		finalData.v1.i = 5;//v1         final ,    
    		
    		/*-----------      ------------------------------------*/
    //		finalData.a = new int[3];//  a final ,    a   
    		finalData.b = new int[13];//  b  final ,          
    		for(int i=0;i<finalData.a.length;i++) 
    			finalData.a[i]++;//  a     int ,  final ,    
    		
    		/*-----------static final    ------------------------------------*/
    //		finalData.VAL_TWO = 4;
    		//   private,          ;   static,       ,       ;   final,         ,     。
    		
    	}
    }

    2、finalメソッドあるクラスがそのサブクラスがメソッドを上書きすることを許可しない場合、このメソッドをfinalメソッドとして宣言できます.
  • メソッドをロックし、継承クラスがその意味と実装を変更することを防止します.
  • は効率的です.コンパイラはfinalメソッドの呼び出しに遭遇すると、組み込みメカニズムに移行し、実行効率を大幅に向上させます.

  • テストケース:
    public class FinalDemo {
    
    	public void f(){
    		System.out.println("FianlDemo.f()");
    	}
    	public final void g(){
    		System.out.println("FianlDemo.g()");
    	}
    }
    継承クラス
    public class FinalOverriding extends FinalDemo{
    
    	public void f(){
    		System.out.println("FinalOverriding.f()");
    	}
    	
    //	public void g(){//       final  g()
    //		System.out.println("FinalOverriding.g()");
    //	}
    }

    3、finalクラスfinalクラスは継承できないため、finalクラスのメンバーメソッドは上書きされる機会がなく、デフォルトはfinalです.クラスを設計する際に、このクラスにサブクラスが必要でなく、クラスの実装の詳細が変更されず、このクラスが拡張されないと確信している場合はfinalクラスとして設計される.
    4、参考:
  • 《Javaプログラミング思想(美)Bruce Eckel著陳昊鵬訳》
  • Javaキーワードfinal、static使用総括