In tutti i tutorial di parole chiave super
che ho trovato online, è difficile ottenere degli esempi più vicini al seguente. La mia domanda:Java - super parola chiave nella nuova discussione Runnable - fa riferimento al metodo non statico attraverso la classe
Qual è la differenza tra
Tracker.super.track(event);
etest.parent.Tracker.track(event);
?Perché il primo funziona?
A cosa si riferisce
Tracker.super
? Un oggetto o una classe?
sottoclasse:
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
}
});
}
}
super-classe
package test.parent;
public abstract class Tracker {
public void track(Event event) {}
}
Aggiornamenti Riferimento:
In jls8, 15.11.2
"Supponiamo che l'espressione di accesso ai campi T.super.f appaia all'interno della classe C, e la superclasse immediata della classe denotata da T sia una classe il cui nome completo sia S. Se f in S è accessibile da C, allora T. super.f è trattato come se fosse stata l'espressione this.f nel corpo della classe S. Altrimenti, si verifica un errore in fase di compilazione.
Così, T.super.f può accedere al f campo che è accessibile in classe S, anche se tale campo è nascosto da una dichiarazione di un campo f in classe T.
È una a tempo di compilazione errore se la classe attuale non è una classe interna della classe T o T stessa ".
'System.out.println (Tracker.class.getName()); ' –
@ElliottFrisch Che cosa significa? Potresti elaborare? –
Stai creando (e chiedendo) le ombre di denominazione in una classe locale anonima (stai anche sottoclassi di 'Runnable'). Scegli il nome che vuoi scoprire e stampalo prendendo la classe. –