„Kommen wir zu einem neuen Thema. Nun möchte ich über statische Variablen und Methoden sprechen.“

„Ellie, ich habe statische Variablen und Methoden schon kennengelernt. Aber ich würde gerne mehr darüber erfahren.“

„Wenn wir Variablen in einer Klasse deklarieren, definieren wir, ob diese Variablen nur einmal erstellt werden, oder ob jede Instanz (also jedes Objekt) der Klasse eine eigene Kopie erhält. Standardmäßig wird für jedes Objekt eine neue Kopie einer Variable erstellt. Das sieht dann so aus:“

Klassendeklaration
class Katze                        // Klasse
{
    String name;                 // Variable

    Katze(String name)             // Konstruktor
    {
        this.name = name;        // Variableninitialisierung
    }
}
Code in der main-Methode:
Cat katze1 = new Katze("Oscar"); // Erstelle ein Objekt, dessen name-Variable "Oscar" enthält
Cat katze2 = new Katze("Missy"); // Erstelle ein Objekt, dessen name-Variable "Missy" enthält
System.out.println(katze1.name);
System.out.println(katze2.name);
Bildschirmausgabe
Oscar
Missy

„Obwohl sie in der gleichen Klasse (Katze) deklariert sind, enthalten die Variablen katze1.name und katze2.name verschiedene Werte, weil sie auf verschiedene Objekte verweisen.“
„Das klingt nachvollziehbar.“
„Es existiert jedoch nur eine Kopie einer statischen Variable für jede Instanz einer Klasse. Auf sie muss über den Klassennamen zugegriffen werden.“

Klassendeklaration
class Katze                   // Klasse
{
    String name;            // Instanzvariable (nicht-statisch)
    static int katzenAnzahl;    // Statische Variable

    Katze(String name)
    {
        this.name = name;
        Cat.katzenAnzahl++;   // Erhöhe die statische Variable um 1
    }
}
Code in der main-Methode:
System.out.println(Cat.katzenAnzahl);
Katze katze1 = new Katze("Oscar");

System.out.println(Cat.katzenAnzahl);
Cat katze2 = new Katze("Missy");

System.out.println(katze1.name);
System.out.println(katze2.name);
System.out.println(Cat.katzenAnzahl);
Bildschirmausgabe:
0
1
Oscar
Missy
2

„Okay, das klingt nachvollziehbar.“

„Java-Methoden werden in zwei Kategorien eingeteilt. Instanzmethoden werden auf einem Objekt aufgerufen und haben Zugriff auf die Daten dieses Objekts. Statische Methoden haben diesen Zugriff nicht, da sie ganz einfach keine Objektreferenz besitzen. Sie können jedoch auf die statischen Variablen der Klasse und andere statische Methoden verweisen.

Statische Methoden können keine nicht-statischen Methoden oder nicht-statischen Variablen ansprechen!“

„Warum ist das so, Ellie?“

„Jede Instanzvariable ist in einem Objekt enthalten. Auf sie kann nur zugegriffen werden, wenn du eine Referenz auf dieses Objekt hast. Eine solche Referenz ist für eine statische Methode nicht verfügbar.“

„Haben Instanzmethoden eine solche Referenz?“

„Ja, sie wird indirekt an Instanzmethoden übergeben. Eine Referenz auf das Objekt, auf dem eine Instanzmethode aufgerufen wird, wird indirekt an die Instanzmethode übergeben. Die Variable, die diese Referenz speichert, heißt this. Dadurch kann die Methode immer auf die Daten des Objekts zugreifen oder eine andere nicht-statische Methode auf demselben Objekt aufrufen.

Anstelle einer Objektreferenz wird null an statische Methoden übergeben. Deshalb können sie keine nicht-statischen Variablen und Methoden ansprechen. Du hast ganz einfach keine Referenz auf ein Objekt, das diesen Variablen und Methoden zugeordnet ist.“

„Okay, Ellie, das verstehe ich.“

„So funktionieren nicht-statische Methoden:

So sieht der Code aus
Katze katze = new Katze();
String name = katze.nameAbrufen();
katze.alterFestlegen(17);
katze.kinderFestlegen(katze1, katze2, katze3);
Das passiert tatsächlich
Katze katze = new Katze();
String name = Katze.nameAbrufen(katze);
Katze.alterFestlegen(katze, 17);
Katze.kinderFestlegen(katze, katze1, katze2, katze3);
Wenn du eine Methode mit <Objekt> Punkt <Methodenname> aufrufst, rufst du tatsächlich eine Klassenmethode auf und übergibst das jeweilige Objekt als ersten Parameter. Innerhalb der Methode wird das Objekt ‚this‘ genannt. Alle Operationen in der Methode werden mit diesem Objekt und seinen Daten durchgeführt.“

„So funktionieren statische Methoden:

So sieht der Code aus
Katze katze1 = new Katze();
Katze katze2 = new Katze();
int katzenAnzahl = Katze.katzenAnzahlAbrufen();
Das passiert tatsächlich
Katze katze1 = new Katze();
Katze katze2 = new Katze();
int katzenAnzahl = Katze.katzenAnzahlAbrufen(null);
Wenn du eine statische Methode aufrufst, wird kein Objekt an sie übergeben. Mit anderen Worten: ‚this‘ ist gleich null. Deshalb kann eine statische Methode nicht auf nicht-statische Variablen und Methoden zugreifen (da sie nichts besitzt, was implizit an nicht-statische Methoden übergeben werden kann).“

„Eine Variable oder Methode ist statisch, wenn das Schlüsselwort ‚static‘ davor steht.“

„Warum werden solche Methoden benötigt, wenn sie so stark beschränkt sind?“

„Nun, solche Methoden haben auch ihre Vorteile.“

„Erstens müssen wir keine Objektreferenz übergeben, um statische Methoden und Variablen zu verwenden.

„Zweitens ist es manchmal notwendig, eine und nur eine Kopie einer Variable zu besitzen. Zum Beispiel System.out (die statische Variable out der System-Klasse).“

„Drittens muss man manchmal eine Methode aufrufen, bevor man Objekte erstellen kann.“

„Ellie, kannst du mir ein Beispiel dafür nennen?“

„Was denkst du, warum die main()-Methode statisch ist? Sie ist statisch, damit der Programmierer sie sofort nach dem Laden einer Klasse in den Speicher aufrufen kann, bevor irgendwelche Objekte erstellt wurden.“