Hintergrund:
In Java, wie in anderen objektorientierten Sprachen, wird ein Mechanismus verwendet, um auf das aktuelle Objekt zu verweisen. In Java wird hierfür das Schlüsselwort this eingeführt, das eine explizite Referenz auf die aktuelle Instanz ermöglicht.
Problem:
Ohne die Verwendung von this können mehrdeutige Situationen auftreten, in denen eine lokale Variable (zum Beispiel ein Parameter des Konstruktors oder einer Methode) das Instanzfeld überschattet. Manchmal ist es auch notwendig, das aktuelle Objekt an eine andere Komponente zu übergeben oder seine Methoden innerhalb der gleichen Klasse aufzurufen.
Lösung:
Das Schlüsselwort this:
Beispiel:
public class Person { private String name; public Person(String name) { this.name = name; // Behebung des Konflikts zwischen Feldern und Parametern } }
Schlüsselfunktionen:
Kann man auf nicht-statische Methoden und Felder ohne this zugreifen?
Ja. Innerhalb von Methoden der Klasse ist es nicht erforderlich, this zu verwenden: Der Compiler greift standardmäßig auf nicht-statische Mitglieder des aktuellen Objekts zu. Die Verwendung von this wird notwendig, wenn es Mehrdeutigkeit gibt (z.B. wenn Parameter des Konstruktors Felder überschattet).
Kann this in einer statischen Methode oder einem statischen Block verwendet werden?
Nein. Im statischen Kontext existiert die Variable this nicht, da statische Elemente nicht von einer bestimmten Instanz abhängen.
Kann der Aufruf this(...) (überladener Konstruktor) nicht die erste Zeile des Konstruktors sein?
Nein. Der Aufruf eines anderen Konstruktors mittels this muss die erste Zeile des Konstruktors sein, sonst tritt ein Kompilierungsfehler auf.
Der Entwickler schreibt einen Konstruktor ohne Verwendung von this, und die Instanzfelder werden nicht korrekt initialisiert:
public class A { private int a; public A(int a) { a = a; } // Fehler! }
Vorteile:
Nachteile:
Der Konstruktor verwendet ausdrücklich this zur Behebung des Namenskonflikts und zur Initialisierung des Feldes:
public class A { private int a; public A(int a) { this.a = a; } }
Vorteile:
Nachteile: