私たちは常に次のように書いています。
public static final int A = 0;
質問:
- クラス で定数
static final
を宣言する唯一の方法はありますか? public final int A = 0;
代わりに書いた場合、A
まだ定数ですか、それとも単なるインスタンスフィールドですか?- インスタンス変数とは?インスタンス変数とインスタンス フィールドの違いは何ですか?
final
これは、初期化後に値を変更できないことを意味します。これにより、値が定数になります。static
つまり、各オブジェクトのフィールドにスペースが割り当てられる代わりに、クラスに対して1つのインスタンスのみが作成されます。
つまり、static final
作成されるオブジェクトの数に関係なく、変数の1つのインスタンスのみを意味し、その変数の値は決して変更できません。
enum
説明した目的のために、Java5以降の型を使用できます。タイプセーフです。インスタンス変数とクラス変数の違いについて話している場合、インスタンス変数は作成されたオブジェクトごとに存在します。クラス変数には、作成されたオブジェクトの数に関係なく、クラスローダーごとに1つのコピーしかありません。
Java5以降のenum
タイプ
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);
}
何でもstatic
クラスレベルです。静的フィールド/メソッドにアクセスするためにインスタンスを作成する必要はありません。クラスがロードされると、静的変数が一度作成されます。
インスタンス変数は、オブジェクトに関連付けられた変数です。つまり、作成するオブジェクトごとにインスタンス変数が作成されます。すべてのオブジェクトは、それ自体のインスタンス変数の個別のコピーを持ちます。
あなたの場合、それを として宣言するとstatic final
、それは variable の 1 つのコピーにすぎません。複数のインスタンスから変更すると、同じ変数が更新されます(ただし、final
変数があるため更新できません)。
2 番目のケースでは、final int a
も定数ですが、その変数が宣言されているクラスのインスタンスを作成するたびに作成されます。
理解を深めるために、この Java チュートリアルをご覧ください。