this (Java, C++, JavaScript, C#) bzw. self (Python, Ruby) ist die Referenz auf das aktuelle Objekt, in dessen Methode man sich gerade befindet. Es macht den Empfänger eines Methodenaufrufs innerhalb der Methode sichtbar.

Namenskonflikt auflösen

Der häufigste Einsatz ist die Unterscheidung zwischen Parameter und gleichnamigem Feld:

public class Punkt {
    private int x;

    public void setzeX(int x) {
        this.x = x;   // Feld x bekommt den Parameter x
    }
}

Ohne this.x würde die Zuweisung nur den Parameter auf sich selbst zeigen lassen und das Feld unverändert lassen. Dasselbe Muster steckt in jedem Setter.

Methodenverkettung

Viele APIs geben this als Rückgabewert zurück, damit man Aufrufe in einer Kette schreiben kann (Fluent Interface, Builder-Muster):

new Builder().mitHoehe(10).mitBreite(20).bauen();

Jede Methode gibt this zurück, dadurch kann die nächste Methode direkt an das Ergebnis angehängt werden.

this in JavaScript — die Stolperfalle

JavaScript bindet this dynamisch je nach Aufrufart:

const knopf = {
    klick: function() {
        setTimeout(function() {
            console.log(this);   // window/undefined statt knopf!
        }, 100);
    }
};

Eine normale Funktion verliert den Empfänger; eine Arrow-Function übernimmt das this aus dem umgebenden Kontext und behebt das Problem. Zusätzlich gibt es call, apply und bind, um this explizit zu setzen — und im strikten Modus ist this in einer losen Funktion undefined statt des globalen Objekts.

Python: self ist explizit

Python übergibt die Objektreferenz ausdrücklich als ersten Parameter — der Name self ist nur Konvention, technisch könnte er beliebig heißen. Die Konvention wird aber strikt befolgt, damit Code lesbar bleibt:

class Auto:
    def __init__(self, typ):
        self.typ = typ   # Attribut des Objekts

    def fahren(self):
        return f"{self.typ} fährt"

In einer statischen Methode gibt es kein self, in einer Klassenmethode stattdessen cls.

this vs. super

Während this/self auf das eigene Objekt zeigt, verweist super auf die direkte Oberklasse. Beim Overriding ruft man mit super.methode() bewusst die überschriebene Version der Elternklasse auf, während this.methode() immer die eigene (überschreibende) Variante treffen würde.

Pitfalls im Überblick

  • Callbacks: this in verschachtelten normalen Funktionen verweist nicht mehr auf das Objekt (JavaScript) — Arrow-Functions oder Bindung verwenden.
  • Statische Kontexte: in statischen Methoden existiert keine Objektreferenz, this/self ist dort nicht verfügbar.
  • Klassenfelder: Vergessenes this. bei der Zuweisung erzeugt still eine lokale Variable statt das Feld zu setzen.

Verwandte Grundlagen: Klasse, Objekt, Methode, Konstruktor, Objektorientierung, Parameter, Variable, Kapselung, Funktion.