私たちは常に書きます:
public static final int A = 0;
質問:
static final
がクラスでconstantを宣言する唯一の方法ですか?public final int A = 0;
と書くと、A
はまだconstantなのか、それともinstanceフィールドなのか?enum
型を使用できます。タイプセーフです。インスタンス変数とクラス変数の違いについて話している場合、インスタンス変数は作成されたオブジェクトごとに存在します。クラス変数には、作成されるオブジェクトの数に関係なく、クラスローダーごとに1つのコピーしかありません。
Java 5以降enum
type
public enum Color{
RED("Red"), GREEN("Green");
private Color(String color){
this.color = color;
}
private String color;
public String getColor(){
return this.color;
}
public String toString(){
return this.color;
}
}
作成した列挙の値を変更する場合は、ミューテーターメソッドを提供します。
public enum Color{
RED("Red"), GREEN("Green");
private Color(String color){
this.color = color;
}
private String color;
public String getColor(){
return this.color;
}
public void setColor(String color){
this.color = color;
}
public String toString(){
return this.color;
}
}
アクセスの例:
public static void main(String args[]){
System.out.println(Color.RED.getColor());
// or
System.out.println(Color.GREEN);
}
final
は、初期化後に値を変更できないことを意味します。これが定数になります。 static
は、各オブジェクトのフィールドにスペースが割り当てられるのではなく、クラスに対して1つのインスタンスのみが作成されることを意味します。
したがって、static final
は、作成されるオブジェクトの数に関係なく、変数の1つのインスタンスのみを意味し、その変数の値は決して変更できません。
static
であるものはすべて、クラスレベルにあります。静的フィールド/メソッドにアクセスするためにインスタンスを作成する必要はありません。クラスがロードされると、静的変数が1回作成されます。インスタンス変数は、オブジェクトに関連付けられた変数です。つまり、作成するオブジェクトごとにインスタンス変数が作成されます。すべてのオブジェクトには、インスタンス変数のコピーが個別にあります。あなたの場合、それをstatic final
として宣言したとき、それは変数の1つのコピーにすぎません。複数のインスタンスから変更すると、同じ変数が更新されます(ただし、final
変数があるため、更新できません)。 2番目のケースでは、final int a
も定数ですが、その変数が宣言されているクラスのインスタンスを作成するたびに作成されます。
このJavaチュートリアル を見て、理解を深めてください。