final修飾子解析


1.final変数
final変数定義:final変数は初期化されると他のオブジェクトを指すことができません.
C++ではconst変数を指すポインタではなくconstポインタです.constポインタは初期化時のアドレスのみを指すことを意味しますが、そのアドレスではオブジェクト自体は変更できます.const変数を指すポインタは、オブジェクト自体は修正できないということです.
 
		/**
		 * StringBuffer     ,
		 *     String | int         final      ,      
		 */
		final StringBuffer ss = new StringBuffer("Aaaaa");
		
		ss = new StringBuffer("Bbbbb"); //       ss          
		
		ss.append("Ccccc");  //        ss           

*finalローカル変数:先に宣言してから初期化できますが、必要ありません.一般的には宣言で初期化します.
final int a = 1;

*finalメンバー変数:宣言先|コンストラクション関数でのみ値を割り当てる
//    
final int a = 0;
final int b;

//     
public test() {
b = 1;
}

*finalメソッドパラメータ変数:メソッドボディでパラメータが変更されないようにする【参照タイプを変更すると、関数外の値に影響する】
作用はパラメータでfinal局所変数を初期化することに等しい.
void testFinalParram() {

		int a = 0;
		testInt(a);

		StringBuffer ss = new StringBuffer("aaaaaa");
		testInt(ss);
		
		//   aaaaaabbbbb      final            ,          。
		//                   ,       
		//                ,        ,             。
		DBG.plog(ss.toString());
	}

	// final             
	public void testInt(final int param) {
		// param = 1; //     
	}

	// final           
	public void testInt(final StringBuffer ss) {

		// ss = new StringBuffer(); //           
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		ss.append("bbbbb"); //       
	}

	//    

	// final             
	public void testInt1(int param) {
		final int param1 = param;
		// param = 1; //     
	}

	// final           
	public void testInt1(StringBuffer ss) {
		final StringBuffer ss1 = ss;
		// ss1 = new StringBuffer(); //           
		ss1.append("1111"); //       
	}

 
2.finalメソッド
1.継承できますが、クラスのメソッドを上書きしたり修正したりすることはできません.
【サブクラスには現れませんが、布団クラスから呼び出すことができます】
2.効率の最適化、コンパイラによるインライン処理
【具体的な内部非接続はJVMによって決定され、また私たちは自分で内部接続を実現することができ、GLのGLASM.jarは実現することができる---InlineAllFinalWrapperFunc】
3.finalクラス
 1.すべてのメソッドを継承できないデフォルトはfinalです
 
final修飾パラメータ、ローカル変数