super.methode / super.variable und super(variable)

Say

Aktives Mitglied
Hallo zusammen,

Möchte nur sicher gehen, ob ich super.methode und super.variabe verstanden habe. Sobald ich eine Superklasse sowie eine Subklasse habe und ich möchte auf die Variablen oder Methoden der Oberklasse zugreifen, dann muss ich super.methode oder super.variable aufrufen? Sobald ich im Konstruktor super(variable) erstelle, erbt die Unterklasse doch die Eigenschaften von der Superklasse, warum soll ich noch einen Methodenaufruf auf die Oberklasse machen?
 
super.variable brauchst du nur, wenn eine Variable in der Subklasse eine gleichnamige Variable in der Oberklasse "versteckt":
Java:
class A {
  int derInt;
}
class B extends A {
  int derInt;
  void gebeDerIntAus() {
    System.out.println(derInt); // <- derInt von B
    System.out.println(super.derInt); // <- derInt von A
  }
}

super.methode() brauchst du, wenn du in der Subklasse eine Methode der Oberklasse überschreibst, aber auf einem Objekt der Subklasse die Methode der Oberklasse aufrufen willst. Normalerweise würde das nämlich ohne "super." dann nicht gehen, weil das dynamische/späte Binden zur Laufzeit immer die am weitesten überschreibende Methode aufruft:
Java:
class A {
  void test() { ... }
}
class B extends A {
  void test() { ... }
  void rufeTestAuf() {
    test(); // <- ruft B.test() auf
    super.test(); // <- ruft A.test() auf
  }
}

Der häufigste Anwendungsfall von super.methode() ist es, innerhalb einer überschreibenden Methode dieselbe Methode der Oberklasse aufzurufen, weil man evtl. von deren Verhalten abhängt bzw. es auch haben möchte:
Java:
class A {
  void test() { ... }
}
class B extends A {
  void test() {
    super.test(); // <- ruft A.test() auf.
    test(); // <- das hier wäre ein Endlosrekursion! Hier würde immer nur B.test() aufgerufen werden, welches sich immer und immer wieder selbst aufruft.
  }
}
 
super.variable brauchst du nur, wenn eine Variable in der Subklasse eine gleichnamige Variable in der Oberklasse "versteckt":
Java:
class A {
  int derInt;
}
class B extends A {
  int derInt;
  void gebeDerIntAus() {
    System.out.println(derInt); // <- derInt von B
    System.out.println(super.derInt); // <- derInt von A
  }
}

super.methode() brauchst du, wenn du in der Subklasse eine Methode der Oberklasse überschreibst, aber auf einem Objekt der Subklasse die Methode der Oberklasse aufrufen willst. Normalerweise würde das nämlich ohne "super." dann nicht gehen, weil das dynamische/späte Binden zur Laufzeit immer die am weitesten überschreibende Methode aufruft:
Java:
class A {
  void test() { ... }
}
class B extends A {
  void test() { ... }
  void rufeTestAuf() {
    test(); // <- ruft B.test() auf
    super.test(); // <- ruft A.test() auf
  }
}

Der häufigste Anwendungsfall von super.methode() ist es, innerhalb einer überschreibenden Methode dieselbe Methode der Oberklasse aufzurufen, weil man evtl. von deren Verhalten abhängt bzw. es auch haben möchte:
Java:
class A {
  void test() { ... }
}
class B extends A {
  void test() {
    super.test(); // <- ruft A.test() auf.
    test(); // <- das hier wäre ein Endlosrekursion! Hier würde immer nur B.test() aufgerufen werden, welches sich immer und immer wieder selbst aufruft.
  }
}
Danke dir!
 

Zurück
Oben