Das Schlüsselwort "this"

Kann jemand die Bedeutung von „this“ erklären?

Für „this“ gibt es mehrere Verwendungen. Gemeinsam ist ihnen, dass „this“ das „aktuelle Objekt“ meint. Das ist im Rumpf einer Methode das Objekt, dem die Nachricht geschickt wurde, die zur Ausführung der Methode führte, auch als „impliziter Parameter“ des Mehtodenaufrufs bezeichnet. In einem Konstruktor ist es das Objekt, das gerade initialisiert wird.

Nun kann man normalerweise Methoden und Attribute des aktuellen Objekts aus diesem selbst heraus abkürzend auch ohne „this“ ansprechen. Es gibt aber Fälle, in denen das „this“ erforderlich ist. Die wichtigsten:

  1. Ein Attribut ist durch eine gleichnamige lokale Variable oder einen formalen Parameter verdeckt, man will aber das Attribut ansprechen. Generell sollte man derlei Verdeckungen am Besten vermeiden, es gibt aber einen typischen Fall, der völlig akzeptabel ist, nämlich eine Attributinitialisierung im Konstruktor durch übergebene Parameter:

    public class Test {
    
        private int bla;
    
        private String blubb;
    
        public Test(int bla, String blubb) {
            this.bla = bla;
            this.blubb = blubb;
        }
    }

    Hier ist das „this“ nötig, damit klar ist, dass bla bzw. blubb auf der linken Seite der Zuweisung das Attribut meint und nicht den gleichnamigen formalen Parameter.

  2. Aufruf eines anderen Konstruktors der gleichen Klasse:

    public class Test {
    
        private int bla;
    
        public Test(int bla) {
            this.bla = bla;
            doSomething();
        }
    
        public Test() {
            this(42);
        }
    }

    Hier wird vom parameterlosen Konstruktor der andere Konstruktor mit einem Default-Wert aufgerufen. Der Vorteil solcher - häufig vorkommenden - Konstrukte ist z.B., dass man Initialisierungen, die allen Konstruktoren gemeinsam sind nur einmal in dem einen Konstruktor schreiben muss, den alle anderen verwenden.

  3. Man will einem Methoden- oder Konstruktoraufruf eine Referenz auf das „aktuelle Objekt“ mitgeben, um so dem Empfänger des Aufrufs die „Verwendung“ dieses Objekt zu ermöglichen. Dazu kann man „this“ übergeben. Hier ein (mäßig sinnvolles) Codebeispiel:

    class Weckdienst {
    
        private LinkedList<Person> zuWeckendePersonen = new LinkedList<Person>();
    
        public void anmeldenZumWecken(Person p) {
            zuWeckendePersonen.add(p);
        }
    
        public void jetztAlleWecken() {
            for (Person p : zuWeckendePersonen) {
                p.wecken();
            }
        }
    }

    Bei einem solchen Weckdienst kann man eine Person durch Aufruf der Methode anmeldenZumWecken() anmelden, wobei man die Person als Parameter übergibt. Nun nehmen wir einmal an, eine Person will sich selbst zum Wecken anmelden. Dann muss sie ja eine Referenz auf sich selbst übergeben. Dazu könnte in einer ihrer Methoden das hier stehen:

        meinWeckDienst.anmeldenZumWecken(this);
  4. Aus einer (nichtstatischen) inneren Klasse heraus kann man das „umgebende Exemplar“ der äußeren Klasse ansprechen, und zwar über den Klassennamen der äußeren Klasse, gefolgt von einem Punkt und dem Schlüsselwort „this“. Dies ist dann nötig, wenn man Elemente des „umgebenden Exemplars“ ansprechen will, diese aber durch gleichnamige Elemente der inneren Klasse verdeckt werden. Der Fall ist also ähnlich dem unter Punkt 1 genannten.

Kann „this“ jemals null sein?

Nein. Denn das Schlüsselwort „this“ bezeichnet immer das „aktuelle Objekt“, im Falle einer Methode das Objekt, auf dem die Methode aufgerufen wurde, im Falle eines Konstruktors das Objekt, welches gerade erzeugt wird. Das Schlüsselwort null bezeichnet die leere Referenz, also eine Referenz, die kein Objekt referenziert. Da man einem nicht vorhandenen Objekt aber keine Nachricht schicken kann, kann this niemals null sein. Deshalb ist der folgende Code absolut sinnlos, da die Prüfung immer zu true auswerten wird:

    void aMethod() {
        if (this != null) {
            // ...
        }
    }

Und in einer statischen Methode? Dort müsste doch „this“ gleich null sein, weil es für statische Methoden kein „aktuelles Objekt“ gibt?

Es ist korrekt, dass statische Methoden nie auf einem Objekt aufgerufen werden, auch wenn Java (leider) eine Syntax erlaubt, die diesen Eindruck erweckt. Also gibt es keine Nachrichtenempfänger und damit auch kein this. Aber das heißt nicht, dass this in einer statischen Methode den Wert null hat: Der Compiler unterbindet schlicht jegliche Verwendung von this in einem statischen Kontext.