In allen super
Keyword-Tutorials fand ich online, es ist schwer, irgendwelche Beispiele näher an folgende zu bekommen. Meine Frage:Java - Super-Schlüsselwort im neuen Thread Runnable - bezieht sich nicht statische Methode durch Klasse
Was ist der Unterschied zwischen
Tracker.super.track(event);
undtest.parent.Tracker.track(event);
?Warum sollte das erste funktionieren?
Was bedeutet
Tracker.super
? Ein Objekt oder eine Klasse?
Unterklasse:
package test;
public class Tracker extends test.parent.Tracker {
@Override
public void track(final Event event) {
Executor.execute(new Runnable() {
public void run() {
Tracker.super.track(event); //this works!! why??
super.track(event); // compile error: cannot resolve
test.parent.Tracker.track(event); //compile error: can only reference static method
}
});
}
}
Superklasse
package test.parent;
public abstract class Tracker {
public void track(Event event) {}
}
Referenz Updates:
In jls8, 15.11.2
"Angenommen, ein Feldzugriffsausdruck T.super.f erscheint innerhalb der Klasse C und die unmittelbare Oberklasse der mit T bezeichneten Klasse ist eine Klasse, deren voll qualifizierter Name S ist. Wenn f in S von C aus zugänglich ist, dann T. super.f wird behandelt, als wäre es der Ausdruck this.f im Rumpf der Klasse S. Andernfalls tritt ein Fehler bei der Kompilierung auf.
So kann T.super.f das Feld f zugreifen, die in der Klasse S zugänglich ist, auch wenn das Feld durch eine Erklärung eines Feldes f in der Klasse T.
verstecktEs ist ein Fehler bei der Kompilierung, wenn die aktuelle Klasse selbst „nicht eine innere Klasse der Klasse T oder T ist.
'System.out.println (Tracker.class.getName()); ' –
@ElliottFrisch Was ist das? Könnten Sie das näher ausführen? –
Sie erstellen (und fragen) nach Benennungsschatten in einer anonymen lokalen Klasse (Sie bilden auch eine Unterklasse von "Runnable"). Wählen Sie den Namen, den Sie herausfinden möchten, und drucken Sie ihn aus, indem Sie die Klasse abrufen. –