Home > Informatik > Begriffe und Konzepte > Klassenattribute

Klassenattribute

Klassenattribute in Java, im engeren Sinne auch statische Attribute genannt, sind Variablen, die direkt zur Klasse gehören und nicht zu einzelnen Instanzen (Objekten) dieser Klasse. Sie werden mit dem Schlüsselwort static deklariert.

Funktion, Nutzen und Einsatzbereiche

Im Gegensatz zu Instanzvariablen, von denen jede Instanz (also jedes Objekt) seine eigene Kopie besitzt, existiert ein Klassenattribut nur einmal pro Klasse. Alle Objekte dieser Klasse haben dann immer den gleichen Attributwert. Ändert ein Objekt den Wert des Klassenattributs, ändert sich dieser Wert für alle anderen Objekte derselben Klasse ebenfalls.

Nutzen
  • Gemeinsamer Zustand: Klassenattribute können Informationen speichern, die für alle Objekte der Klasse identisch sind. Ein bekanntes Beispiel ist der Mehrwertsteuersatz für die Objekte eines Lagersystems; alle Objekte haben den gleichen Mehrwertsteuersatz.

  • Speichereffizienz: Da das Attribut nur einmal für die Klasse und nicht für jedes einzelne Objekt gespeichert wird, kann dies bei Speicher sparen, wenn viele Objekte der selben Klasse existieren. Dies ist zum Beispiel der Fall, wenn ein Array mit 100 Objekten vorliegt, bei denen ein, zwei oder mehr Werte identisch sind.

  • Einfacher Zugriff: Man kann auf Klassenattribute direkt über den Klassennamen zugreifen, ohne erst ein Objekt erzeugen zu müssen. Ein bekanntes Beispiel für ein solches Klassenattribut ist die Konstante Math.PI. Man kann diese Konstante verwenden, ohne dass man vorher ein Objekt der Klasse Math anlegen muss.

Einsatzbereiche

Klassenattribute sind besonders nützlich in folgenden Szenarien:

  • Konstanten definieren: Für Werte, die sich während der gesamten Programmausführung nicht ändern sollen (oft in Kombination mit final). Ein klassisches Beispiel ist Math.PI (siehe oben):

  • Zähler implementieren: Um mitzuzählen, wie viele Objekte einer Klasse erstellt wurden. Das Klassenattribut, das den Zähler implementiert, wird im Konstruktor eines jeden neuen Objektes inkrementiert.

  • Globale Konfigurationswerte: Für Einstellungen, die das Verhalten aller Objekte einer Klasse steuern, wie z.B. ein gemeinsamer Zinssatz für alle Konten in einer Konto-Klasse oder gemeinsame Mehrwertsteuer für alle Produkte eines Lagers.

Codebeispiel 1

public class Beispiel
{
    // Instanzvariablen – jedes Objekt hat seine eigenen Werte
    private int zahl1;
    private int zahl2;

    // Klassenattribut – wird von allen Objekten gemeinsam genutzt
    private static int gemeinsamerWert;

    // Konstruktor
    public Beispiel(int z1, int z2)
    {
        zahl1 = z1;
        zahl2 = z2;
    }

    // Getter für die Instanzvariablen
    public int getZahl1()
    {
        return zahl1;
    }

    public int getZahl2()
    {
        return zahl2;
    }

    // Getter und Setter für das Klassenattribut
    public static int getGemeinsamerWert()
    {
        return gemeinsamerWert;
    }

    public static void setGemeinsamerWert(int wert)
    {
        gemeinsamerWert = wert;
    }
}

Und hier eine Testklasse, mit der überprüft werden soll, ob die Änderung des Klassenattributs durch ein Objekt x sich auf das Objekt y auswirkt.

public class Test
{
    Beispiel bsp1, bsp2;
    
    public Test()
    {
       bsp1 = new Beispiel(4,6);
       bsp2 = new Beispiel(5,7);
    }
    
    public void runTest()
    {
       System.out.println("Werte von Objekt 1"); 
       System.out.println("Zahl 1.1 = " + bsp1.getZahl1());
       System.out.println("Zahl 1.2 = " + bsp1.getZahl2());
       
      System.out.println("\nWerte von Objekt 2"); 
       System.out.println("Zahl 2.1 = " + bsp2.getZahl1());
       System.out.println("Zahl 2.2 = " + bsp2.getZahl2());  
       
      bsp1.setGemeinsamerWert(8);
      System.out.println("\nWerte des Klassenattributs"); 
       
      System.out.println("Objekt 1 = " + bsp1.getGemeinsamerWert());
      System.out.println("Objekt 2 = " + bsp2.getGemeinsamerWert());
      
      System.out.println("\nVeränderung des Klassenattributs 8 ⟹ 12 in Objekt 1"); 
     
      bsp1.setGemeinsamerWert(12);
      System.out.println("\nWerte des Klassenattributs"); 
       
      System.out.println("Objekt 1 = " + bsp1.getGemeinsamerWert());
      System.out.println("Objekt 2 = " + bsp2.getGemeinsamerWert());      
    }
}

Wie die folgende Konsolenausgabe zeigt, war dieser Test erfolgreich:

Werte von Objekt 1
Zahl 1.1 = 4
Zahl 1.2 = 6

Werte von Objekt 2
Zahl 2.1 = 5
Zahl 2.2 = 7

Werte des Klassenattributs
Objekt 1 = 8
Objekt 2 = 8

Veränderung des Klassenattributs 8 ⟹ 12 in Objekt 1

Werte des Klassenattributs
Objekt 1 = 12
Objekt 2 = 12

Zunächst zeigen beide Objekte bsp1 und bsp2 unterschiedliche Werte bei den normalen Instanzvariablen und gleiche Werte beim Klassenattribut.

Wenn dann das Klassenattribut durch Objekt bsp1 von 8 auf 12 geändert wird, zeigt auch das Objekt bsp2 diesen veränderten Wert an.

Codebeispiel 2

Das zweite Beispiel ist sehr kurz, hier soll verdeutlicht werden, wie man einen Zähler einsetzt, um die Zahl der erzeugten Objekte zu protokollieren:

public class Beispiel2
{
    private static int zaehler = 0;

    public Beispiel2()
    {
        zaehler++;
        show();
    }

    public void show()
    {
        System.out.println("Anzahl der erzeugten Objekte: " + zaehler);
    }

}

Jedes Mal, wenn ein neues Objekt erzeugt wird, wird der Zähler um 1 inkrementiert. Den Beweis liefert das folgende Testprogramm:

public class Test2
{
   Beispiel2 objekt;
   
   public Test2()
   {
      for (int i=1; i<=10; i++)
      {
         objekt = new Beispiel2();
      }   
   }
}

Betrachten wir dazu die Konsolenausgabe des Testprogramms:

Anzahl der erzeugten Objekte: 1
Anzahl der erzeugten Objekte: 2
Anzahl der erzeugten Objekte: 3
Anzahl der erzeugten Objekte: 4
Anzahl der erzeugten Objekte: 5
Anzahl der erzeugten Objekte: 6
Anzahl der erzeugten Objekte: 7
Anzahl der erzeugten Objekte: 8
Anzahl der erzeugten Objekte: 9
Anzahl der erzeugten Objekte: 10

Quellen:

  1. Balzert: Objektorientiert Programmieren, 4. Auflage, Springer-Verlag Berlin 2025.