So deklarieren Sie eine Konstante in Java

71

Wir schreiben immer:

public static final int A = 0;  

Frage:

  1. Ist static finaldie einzige Möglichkeit, eine Konstante in einer Klasse zu deklarieren ?
  2. Wenn ich public final int A = 0;stattdessen schreibe , ist das Aimmer noch eine Konstante oder nur ein Instanzfeld ?
  3. Was ist eine Instanzvariable ? Was ist der Unterschied zwischen einer Instanzvariablen und einem Instanzfeld ?
Bin_Z
quelle

Antworten:

38
  1. Sie können einen enumTyp in Java 5 und höher für den von Ihnen beschriebenen Zweck verwenden. Es ist typsicher.
  2. A ist eine Instanzvariable. (Wenn es den statischen Modifikator hat, wird es zu einer statischen Variablen.) Konstanten bedeuten nur, dass sich der Wert nicht ändert.
  3. Instanzvariablen sind Datenelemente, die zum Objekt und nicht zur Klasse gehören. Instanzvariable = Instanzfeld.

Wenn Sie über den Unterschied zwischen Instanzvariable und Klassenvariable sprechen, existiert eine Instanzvariable pro erstelltem Objekt. Während die Klassenvariable unabhängig von der Anzahl der erstellten Objekte nur eine Kopie pro Klassenladeprogramm hat.

Java 5 und höher enumTyp

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;
  }
}

Wenn Sie den Wert der von Ihnen erstellten Aufzählung ändern möchten, geben Sie eine Mutator-Methode an.

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;
  }
}

Beispiel für den Zugriff:

public static void main(String args[]){
  System.out.println(Color.RED.getColor());

  // or

  System.out.println(Color.GREEN);
}
Oh Chin Boon
quelle
1
die zweite Frage, da A nicht geändert werden kann, ist es immer noch eine Instanzvariable ?
Bin_Z
1
Ja, es ist immer noch eine Instanzvariable. Es existiert eine pro erstelltem Objekt.
Oh Chin Boon
1
Richtig, aber Sie können es genauso gut zu einer statischen Variablen machen, wenn sie nicht geändert werden kann :)
Alexander Mills
68

finalbedeutet, dass der Wert nach der Initialisierung nicht mehr geändert werden kann. Das macht ihn zu einer Konstanten. staticbedeutet, dass anstelle von Speicherplatz für das Feld in jedem Objekt nur eine Instanz für die Klasse erstellt wird.

Bedeutet static finalalso nur eine Instanz der Variablen, egal wie viele Objekte erstellt werden, und der Wert dieser Variablen kann sich niemals ändern.

Peter Lundgren
quelle
1
Kein Java-Experte, finalklingt aber für mich wie "schreibgeschütztes Feld" und eine "Konstante" sollte zur Kompilierungszeit konstant sein
fjch1997
-1. Warnung: A final intkann nicht in einer switchAnweisung verwendet werden, was mich zu der Annahme führt, dass a final intkeine Konstante für die Kompilierungszeit ist.
Starbeamrainbowlabs
In der Tat ist es keine Konstante für die Kompilierungszeit. Die Definition "In der Computerprogrammierung ist eine Konstante ein Wert, der vom Programm während der normalen Ausführung nicht geändert werden kann, dh der Wert ist konstant" erfordert jedoch nicht unbedingt, dass es sich um eine Konstante zur Kompilierungszeit handelt, sondern um eine Laufzeitkonstante. Diese Antwort ist also immer noch richtig.
Eis
4

Alles, was ist, staticist in der Klassenstufe. Sie müssen keine Instanz erstellen, um auf statische Felder / Methoden zugreifen zu können. Die statische Variable wird beim Laden der Klasse einmal erstellt.

Instanzvariablen sind die dem Objekt zugeordnete Variable. Dies bedeutet, dass für jedes von Ihnen erstellte Objekt Instanzvariablen erstellt werden. Alle Objekte haben eine separate Kopie der Instanzvariablen für sich.

In Ihrem Fall, wenn Sie es als deklariert haben static final, ist dies nur eine Kopie der Variablen. Wenn Sie es von mehreren Instanzen aus ändern, wird dieselbe Variable aktualisiert (Sie haben jedoch eine finalVariable, sodass sie nicht aktualisiert werden kann).

Im zweiten Fall ist das final int aebenfalls konstant, wird jedoch jedes Mal erstellt, wenn Sie eine Instanz der Klasse erstellen, in der diese Variable deklariert ist.

Schauen Sie sich dieses Java-Tutorial zum besseren Verständnis an.

Jimmy
quelle