final学習ノート(一)
1437 ワード
まず、次のコードを見てみましょう.
コンパイルは通過しません.11行目でエラーが発生しました.メンバー変数aはfinalタイプとして宣言されるため、すなわちaはクラスの複数のオブジェクトによって共有され、クラスを作成するオブジェクトは変数aに値を付与しなければならず、値を付与すると変更できない.しかし、1つのクラスに複数の構造方法がある場合、メンバー変数aは、各構造方法において初期化する必要がある、すなわちthis.name=nameの前にa=5を1行加えると、コンパイルが通過します.
まとめ:
参照
finalタイプメンバー変数の初期化方法には、次の2つがあります.
1、変数を宣言する時に直接値を与える;
2、構築メソッドで付与を完了し、1つのクラスに複数の構築メソッドがある場合は、各構築メソッドでfinalタイプのメンバー変数の付与を完了することを保証します.
このコードを少し変更してfinalの前にstaticを追加します.
コンパイルもパスしません.
まとめ:
参照
final+staticで宣言されたメンバー変数には、宣言時に値を割り当てる必要があります.構築メソッドで値を割り当てることはできません.
staticタイプの変数は、クラスをロードするときに作成されるので、つまりオブジェクトを作成する前に構築メソッドを実行する前に実行されます.
public class Test2 {
private final int a;
private String name;
public Test2() {
a=3;
}
public Test2(String name) {
this.name=name;
}
public static void main(String[] args) {
Test2 test = new Test2();
Test2 test2 = new Test2("hello");
}
}
コンパイルは通過しません.11行目でエラーが発生しました.メンバー変数aはfinalタイプとして宣言されるため、すなわちaはクラスの複数のオブジェクトによって共有され、クラスを作成するオブジェクトは変数aに値を付与しなければならず、値を付与すると変更できない.しかし、1つのクラスに複数の構造方法がある場合、メンバー変数aは、各構造方法において初期化する必要がある、すなわちthis.name=nameの前にa=5を1行加えると、コンパイルが通過します.
まとめ:
参照
finalタイプメンバー変数の初期化方法には、次の2つがあります.
1、変数を宣言する時に直接値を与える;
2、構築メソッドで付与を完了し、1つのクラスに複数の構築メソッドがある場合は、各構築メソッドでfinalタイプのメンバー変数の付与を完了することを保証します.
このコードを少し変更してfinalの前にstaticを追加します.
public class Test2 {
private static final int a;
private String name;
public Test2() {
a=3;
}
public Test2(String name) {
a=7;
this.name=name;
}
public static void main(String[] args) {
Test2 test = new Test2();
Test2 test2 = new Test2("hello");
}
}
コンパイルもパスしません.
まとめ:
参照
final+staticで宣言されたメンバー変数には、宣言時に値を割り当てる必要があります.構築メソッドで値を割り当てることはできません.
staticタイプの変数は、クラスをロードするときに作成されるので、つまりオブジェクトを作成する前に構築メソッドを実行する前に実行されます.