(七):finalとstatic final変数(原生タイプ)の初期化方式

1541 ワード

public class FinalOriginalTest {
	private final int a;
	private String name;
	public FinalOriginalTest(){
		a = 3;
	}
	public FinalOriginalTest(String name){
		this.name = name;
	}
	public static void main(String[] args){
		FinalOriginalTest ft = new FinalOriginalTest();
		FinalOriginalTest ft1 = new FinalOriginalTest("hello");
	}
}

質問1:上のプログラムはコンパイルできますか?できない場合は理由を説明してください.
解答:コンパイルできません.初期化変数aがない可能性があります.finalタイプのメンバー変数の初期化は、構築メソッドで付与が完了するため、クラスに複数の構築メソッドがある場合は、各構築メソッドでfinalタイプ変数の初期化が完了することを保証します.したがって、public FinalOriginalTest(String name)構造方法でaに値を割り当てる必要がある.
注意:finalはクラス、メソッド、変数に使用できます.
1、finalはクラスで使用され、現在のクラスは継承できず、サブクラスがないことを示します.
2、finalは方法に用いられ、現在の方法はoverrideされず、書き換えられないことを示している.
3、finalは変数に用いられ、現在の変数が最終状態の変数であり、定数であることを示し、この変数の値は与えられたが、与えられた後は変更できない.
finalタイプのメンバー変数の初期化方法:
1、変数宣言時に直接値を付ける
2、コンストラクションメソッドで付与を完了し、1つのクラスに複数のコンストラクションメソッドがある場合は、各コンストラクションメソッドでfinalタイプ変数の初期化を完了することを保証します.
問題2:上記のプログラムでは、問題1を修正した後、private final int a;private static final int aに変更します.コンパイルできますか?できない場合は理由を説明してください.
aは静的変数であるため、このクラスがインスタンス化されていない間に、その値はすでに存在します.したがって、intタイプのstatic finalタイプの変数aには、宣言時にprivate static final int a=3を割り当てるしかありません.そして構造方法の中の付与値を注釈にして、コンパイルが通過します.
まとめ:finalタイプの変数について、staticを追加しない場合は、変数を宣言するときに直接値を割り当てる2つの方法があります.コンストラクションメソッドで値の割り当てを完了し、クラスに複数のコンストラクションメソッドがある場合は、各コンストラクションメソッドでfinalタイプ変数の初期化が完了することを保証します.変数がfinalでstaticの場合、変数を宣言するときに直接値を割り当てる必要があります.