Java – this, super, this() & super()¶
1) this und super (ohne Klammern)¶
this¶
this verweist auf das aktuelle Objekt (Instanz der Klasse).
Verwendung:
- Zugriff auf Instanzvariablen
- Zugriff auf Methoden der eigenen Klasse
- Auflösung von Namenskonflikten (Parameter = Feldname)
- Übergabe des aktuellen Objekts als Parameter
Beispiel:
class Person {
private String name;
public Person(String name) {
this.name = name; // Feld = Parameter
}
public void register() {
Database.save(this); // Übergabe des aktuellen Objekts
}
}
Ohne this wäre name = name; bedeutungslos,
da der Parameter sich selbst zugewiesen würde.
super¶
super verweist auf die Elternklasse.
Verwendung:
- Zugriff auf geerbte Variablen
- Aufruf überschriebener Methoden
Beispiel:
class Person {
void print() {
System.out.println("Person");
}
}
class Student extends Person {
void print() {
System.out.println("Student");
super.print(); // Aufruf der Elternmethode
}
}
Würde man statt super.print() einfach print() schreiben,
würde die Methode sich selbst rekursiv aufrufen.
Wichtige Regel¶
this und super können nicht in statischen Kontexten verwendet werden.
Warum?
Statische Elemente gehören zur Klasse,
this und super beziehen sich auf eine Instanz (Objekt).
2) this() und super() (mit Klammern)¶
Hier handelt es sich um Konstruktoraufrufe.
this()¶
- Ruft einen anderen Konstruktor derselben Klasse auf
- Wird für Constructor Chaining verwendet
- Muss die erste Anweisung im Konstruktor sein
Beispiel (gute Variante):
class Person {
private String name;
private int age;
public Person() {
this("Unbekannt", 0);
}
public Person(String name) {
this(name, 0);
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Nur der letzte Konstruktor initialisiert die Variablen.
Die anderen rufen ihn auf.
Das nennt man Constructor Chaining.
Vorteile:
- Kein doppelter Code
- Weniger Fehler
- Klare Verantwortlichkeit
Schlechte Variante (Code-Duplikation)¶
class Person {
private String name;
private int age;
public Person() {
this.name = "Unbekannt";
this.age = 0;
}
public Person(String name) {
this.name = name;
this.age = 0;
}
}
Hier wird Initialisierungslogik mehrfach geschrieben → fehleranfällig.
3) super()¶
super() ruft den Konstruktor der Elternklasse auf.
- Muss ebenfalls die erste Anweisung im Konstruktor sein
- Wird automatisch eingefügt, wenn kein Konstruktoraufruf geschrieben wird
- Standardmäßig wird
super()ohne Parameter aufgerufen
Beispiel:
class Shape {
int x;
int y;
Shape(int x, int y) {
this.x = x;
this.y = y;
}
}
class Rectangle extends Shape {
int width;
int height;
Rectangle(int x, int y, int width, int height) {
super(x, y); // ruft Parent-Konstruktor
this.width = width;
this.height = height;
}
}
Der Parent-Konstruktor initialisiert x und y.
Der Child-Konstruktor initialisiert width und height.
Wichtige Besonderheit (prüfungsrelevant)¶
Wenn die Elternklasse keinen parameterlosen (No-Arg) Konstruktor besitzt,
fügt der Compiler kein automatisches super() ein.
In diesem Fall muss super(...) explizit mit passenden Parametern
aufgerufen werden — sonst entsteht ein Compile-Fehler.
4) Zentrale Regeln¶
this()odersuper()müssen immer erste Zeile im Konstruktor sein- Ein Konstruktor darf entweder
this()odersuper()enthalten - Niemals beide im selben Konstruktor
- Der Compiler fügt automatisch
super()ein, wenn nichts angegeben ist - Kein Zugriff auf
thisodersuperin statischen Methoden
5) Zusammenfassung¶
| Begriff | Bedeutung |
|---|---|
this |
aktuelles Objekt |
super |
Elternklasse |
this() |
ruft anderen Konstruktor derselben Klasse auf |
super() |
ruft Konstruktor der Elternklasse auf |
Prüfungsrelevant¶
- Unterschied Objektbezug (
this) vs. Vererbungsbezug (super) - Constructor Chaining
- Erste-Anweisung-Regel
- Automatischer
super()-Aufruf - Compile-Fehler bei fehlendem Parent-NoArg-Konstruktor
- Kein Zugriff in statischen Methoden
Sauberer Konstruktorcode spart später Debugging-Zeit.
Constructor Chaining verhindert Code-Duplikation.
Vererbung funktioniert nur korrekt, wenn Initialisierung klar strukturiert ist.