web-dev-qa-db-ja.com

Javaで定数を宣言する方法

私たちは常に書きます:

public static final int A = 0;  

質問:

  1. static finalがクラスでconstantを宣言する唯一の方法ですか?
  2. 代わりにpublic final int A = 0;と書くと、Aはまだconstantなのか、それともinstanceフィールドなのか?
  3. インスタンス変数とは何ですか? インスタンス変数インスタンスフィールドの違いは何ですか?
55
Bin_Z
  1. 説明した目的のために、Java 5以降でenum型を使用できます。タイプセーフです。
  2. Aはインスタンス変数です。 (静的修飾子がある場合、静的変数になります。)定数は、値が変更されないことを意味します。
  3. インスタンス変数は、クラスではなくオブジェクトに属するデータメンバーです。インスタンス変数=インスタンスフィールド。

インスタンス変数とクラス変数の違いについて話している場合、インスタンス変数は作成されたオブジェクトごとに存在します。クラス変数には、作成されるオブジェクトの数に関係なく、クラスローダーごとに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);
}
35
Oh Chin Boon

finalは、初期化後に値を変更できないことを意味します。これが定数になります。 staticは、各オブジェクトのフィールドにスペースが割り当てられるのではなく、クラスに対して1つのインスタンスのみが作成されることを意味します。

したがって、static finalは、作成されるオブジェクトの数に関係なく、変数の1つのインスタンスのみを意味し、その変数の値は決して変更できません。

60
Peter Lundgren

staticであるものはすべて、クラスレベルにあります。静的フィールド/メソッドにアクセスするためにインスタンスを作成する必要はありません。クラスがロードされると、静的変数が1回作成されます。インスタンス変数は、オブジェクトに関連付けられた変数です。つまり、作成するオブジェクトごとにインスタンス変数が作成されます。すべてのオブジェクトには、インスタンス変数のコピーが個別にあります。あなたの場合、それをstatic finalとして宣言したとき、それは変数の1つのコピーにすぎません。複数のインスタンスから変更すると、同じ変数が更新されます(ただし、final変数があるため、更新できません)。 2番目のケースでは、final int aも定数ですが、その変数が宣言されているクラスのインスタンスを作成するたびに作成されます。

このJavaチュートリアル を見て、理解を深めてください。

3
Jimmy