# Überschriebene Methode der Oberklasse der Oberklasse aufrufen.



## Schesam (25. Apr 2016)

Hey.

Ich hab beim lesen von paar sources auf der Java-Se diese Methode gefunden:


```
@Override  // override for Javadoc
    public ValueRange range(TemporalField field) {
        return Temporal.super.range(field);
    }
```

Sowas habe ich vorher noch nicht gesehen. Ich hab auch mehrere versuche in ner Testklasse gemacht, zu versuchen zu verstehen wann das funktioniert. Aber ich hab IMMER nen Compiler-Fehler bekommen.

Ich hab Sachen wie  eine Testklasse von einer anderen Testklasse abgeleitet, die equals() überschrieben hat und versucht, auf die equals aus Object zuzugreifen mit super.super.equals(); was aber nicht funktioniert. Ich hab ein Objekt einer Klasse erzeugt und versucht von diesem Objekt super aufzurufen, hat auch nicht funktioniert. Was macht obigen Code so speziell und wie setzt man das sinnvoll um?

Als Beispiel:


```
public class MethodeDerOberklasseDerOberklasse {

    public static class OberKlasse {

        @Override
        public String toString() {
            return "Fail";
        }

    }

    public static class UnterKlasse extends OberKlasse {

        @Override
        public String toString() {
            return super.toString();
        }

    }

    public static void main(String[] args) {
        UnterKlasse u = new UnterKlasse();
        String s = UnterKlasse.super.toString();
        System.out.println(u);
    }

}
```

Ob ich nun UnterKlasse.super oder u. super schreibe, es passt nicht. Also wie ist sowas möglich?


----------



## mrBrown (25. Apr 2016)

Mit Temporal.super kann man auf die default-Methoden des implementierten Interfaces zugreifen. Im Prinzip ist es das Äquivalent zu this.super, womit man immer auf die Methode der Superklasse zugreift.
Da man mehrere Interfaces implementiere kann, muss man spezifizieren, wessen default-Methode man aufrufen möchte.

Warum das in obigem Code gemacht ist? Vermutlich genau der, den der Kommentar anführt 

super.super ist per Spezifikation nicht möglich,


----------



## Viktim (26. Apr 2016)

du könntest ja in deine Oberklasse eine Methode schreiben, die die Methode aus der Oberklasse der Oberklasse aufruft


----------



## mrBrown (26. Apr 2016)

Hier ist ein Grund aufgeführt, warum es nicht möglich ist: http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java

Außerdem gibts da Beispiele, wie man's mit Reflection umgeht, sollte man aber meiden. Wenn man das zwingend braucht, dürfte in den meisten Fällen das Design falsch sein


----------



## CSHW89 (28. Apr 2016)

Ich hatte letztens erst genau das gleiche Problem. Und ich finde, da wäre es durchaus legitim gewesen. Es ging um die Klasse JTable und die Methode getCellEditor. Nun hatte ich eine abstrakte Klasse A die von JTable erbt, in der ich angeben wollte, dass erbende Klassen von A diese Methode überschreiben sollen. Also Methode in A mit abstract überschreiben. Klasse B, die nun von A erbt, überschreibt die Methode, braucht aber für einen Standardfall die Methode aus JTable. Ist vielleicht kein alzu glückliches Beispiel und ich habs danach gelassen, aber in diesem Fall wärs schon gut gewesen.


----------



## mrBrown (28. Apr 2016)

Warum sollen Unterklassen von A die Methode zwingend überschreiben, wenn immer noch die Implementierung aus der Oberklasse von A korrekt ist? Das klingt eher nach falschem Design, als nach nem zwingendem Grund für super.super...


----------

