私たちは常に次のように書いています。
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 チュートリアルをご覧ください。