„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 Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Code in der main-Methode:
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
Bildschirmausgabe
Oscar
Missy

„Obwohl sie in der gleichen Klasse (Katze) deklariert sind, enthalten die Variablen cat1.name und cat2.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 Cat                   // Сlass
{
    String name;            // Instance (non-static) variable
    static int catCount;    // Static variable

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   // Increment the static variable by 1
    }
}
Code in der main-Methode:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
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
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Das passiert tatsächlich
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
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
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Das passiert tatsächlich
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(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.“