Helmichs Informatik-Lexikon

static (Attribute)

Wird ein Attribut einer Klasse als static bezeichnet:

private static int anzahl;

so hat dieses Attribut bei jedem Objekt der Klasse den gleichen Wert. Solche Attribute werden auch als Klassen-Attribute bezeichnet, da sie keine Eigenschaft eines einzelnen Objektes sind, sondern eine Eigenschaft aller Objekte, also eine Eigenschaft der ganzen Klasse.

Hier ein kleines Anwendungsbeispiel. In einer Personaldatei sollen die Daten von Angehörigen eines Betriebes gespeichert werden. Da der Datenschutzbeauftragte sehr eifrig war, dürfen in dieser Datei nur der Name, der Vorname und das Alter der Person sowie eine laufende Nummer gespeichert werden.

Diese laufende Nummer soll eindeutig sein, das heißt, jede Person hat eine eigene Nummer, die erste Person die Nr. 1, die zweite Person die Nr. 2 und so weiter. Beim Erzeugen eines neuen Objektes der Klasse Person wird die Personalnummer im Konstruktor der Klasse festgelegt.

Hier die Klasse Person:

public class Person
{
   private String name, Vorname;
   private int alter;
   private static int anzahl;
   private final int lfdNr;
 
   public Person(String n, String v, int a)
   {
      name = n;
      Vorname = v;
      alter   = a;
      lfdNr = ++anzahl;
   }
 
   public void anzeigen()
   {
      System.out.println
      (lfdNr+".: "+ Vorname + " " + name + " (" +alter +")");
   }
}

Quelltext 1: Definition der Klasse Person

Zum Testen dieser Klasse schreibt man sich eine Testklasse, zum Beispiel diese:

public class Person Test
{
   Person p1,p2,p3;
 
   public Person Test()
   {
      p1 = new Person("Helmich","Ulrich",58);
      p2 = new Person("Beutlin","Frodo",33);
      p3 = new Person("White","Walter",50);
      p1.anzeigen();
      p2.anzeigen();
      p3.anzeigen();
   }
 }

Quelltext 2: Definition der Testklasse Person Test

Die Ausgabe der Testklasse Person Test sieht dann so aus:

1.: Ulrich Helmich (58)
2.: Frodo Beutlin (33)
3.: Walter White (50)

Was passiert hier genau?

Wenn das erste Objekt angelegt wird, ruft man den Konstruktor auf. Diesem Konstruktor werden als Parameter der Name, der Vorname und das Alter übergeben, nicht aber die laufende Nummer der Person, weil diese ja automatisch generiert werden soll. Die entscheidende Zeile im Konstruktor ist diese:

 lfdNr = ++anzahl;

Das Attribut anzahl, das als int-Variable ja stets den Anfangswert 0 hat, wird durch diese Anweisung um Eins erhöht, und zwar bevor der Wert von anzahl dem final-Attribut lfdNr zugewiesen wird (der ++ - Operator steht vor dem Bezeichner!). Das Attribut lfdNr ist also eine Konstante und kann nach der Zuweisung des Wertes von anzahl nicht mehr verändert werden.

  1. Bei der Erzeugung des ersten Objektes wird anzahl also auf den Wert 1 gesetzt, und die laufende Nummer dieses Objektes (dieser Person) ist dann 1.
  2. Wenn das zweite Objekt erzeugt wird, hat anzahl bereits den Wert 1, denn anzahl ist ein statisches Attribut, und hat bei allen Objekten den gleichen Attributwert. Da der Wert von anzahl bei der Erzeugung des ersten Objektes auf 1 gesetzt wurde, hat auch das zweite Objekt ein Attribut anzahl mit dem gleichen Wert 1. Allerdings wird dieser Wert im Konstruktor des zweiten Objektes auf den Wert 2 gesetzt und danach wird der Wert 2 dem Attribut lfdNr zugewiesen. Würde man jetzt beim ersten Objekt nachschauen, welchen Wert das Attribut anzahl hat, so würde man auch hier den Wert 2 sehen.
  3. Wen das dritte Objekt erzeugt wird, hat anzahl auch diesen Wert 2, der dann aber im Konstruktor für alle Objekte (!) auf 3 erhöht wird. Diese 3 wird dann dem Attribut lfdNr des dritten Objektes zugewiesen. Auch bei den beiden anderen Objekten hat anzahl jetzt den Wert 3.

Um dies zu überprüfen, erweitern wir zunächst die anzeigen-Methode der Klasse Person:

public void anzeigen()
{
   System.out.println
   (lfdNr+"/" + anzahl + ": " + 
    Vorname + " " + name + " (" +alter +")");
}

Quelltext 3: Ein kleiner Test

Jetzt werden beide Attribute angezeigt, anzahl und lfdNr. Dann erweitern wir die Testklasse Person Test:

public class Person Test
{
   Person p1,p2,p3;
 
   public Person Test()
   {
      p1 = new Person("Helmich","Ulrich",58);
      p1.anzeigen();

      p2 = new Person("Beutlin","Frodo",33);
      p1.anzeigen();
      p2.anzeigen();

      p3 = new Person("White","Walter",50);
      p1.anzeigen();
      p2.anzeigen();
      p3.anzeigen();
   }
 }

Quelltext 4: Erweiterung der Klasse Person für Testzwecke

Nach dem Erzeugen eines jeden Objektes wird sofort die anzeigen-Methoden aller bisher erzeugten Objekte aufgerufen, um zu überprüfen, ob der Wert von anzahl bei allen Objekten immer gleich ist. Hier das Ergebnis der Konsolenausgabe:

1/1: Ulrich Helmich (58)
1/2: Ulrich Helmich (58)
2/2: Frodo Beutlin (33)
1/3: Ulrich Helmich (58)
2/3: Frodo Beutlin (33)
3/3: Walter White (50)

Tatsächlich hat anzahl bei allen bisher erzeugten Objekten stets den gleichen Wert, während lfdNr bei jedem Objekt einen eigenen aufsteigenden Wert hat.