Wei*_*eng 6 java super runnable
在super我在网上找到的所有关键词教程中,很难让任何一个例子更接近于一个.我的问题:
Tracker.super.track(event);和之间有什么区别test.parent.Tracker.track(event);?
为什么第一个工作?
什么Tracker.super指的是?一个对象还是一个类?
子类:
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
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
超级
package test.parent;
public abstract class Tracker {
public void track(Event event) {}
}
Run Code Online (Sandbox Code Playgroud)
参考更新:
在jls8,15.11.2中
"假设字段访问表达式T.super.f出现在类C中,并且由T表示的类的直接超类是一个完全限定名称为S的类.如果S中的f可以从C访问,那么T.super .f被视为在类S的主体中是表达式this.f.否则,发生编译时错误.
因此,T.super.f可以访问类S中可访问的字段f,即使该字段被类T中的字段f的声明隐藏.
如果当前类不是类T或T本身的内部类,那么这是一个编译时错误."
您的run()方法位于 的匿名子类中,Runnable它也是 的内部类Tracker。
实际上与
package test;
public class Tracker extends test.parent.Tracker {
...
@Override
public void track(final Event event) {
//anonymous class translated into local class
class TrackerRunnable implements 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
}
}
Executor.execute(new TrackerRunnable());
}
}
Run Code Online (Sandbox Code Playgroud)
在 Java 中,内部类还具有对其“所属”的外部类的引用。您可以在 run 内部引用thisas TrackerRunnable,this但如果您需要访问与 关联的实例,Tracker则TrackerRunnable可以将其访问为Tracker.this。同样的事情与Tracker.super. 只是意味着notsuper的超类(在本例中是)。TrackerRunnableTrackerRunnable
主要要注意的是,这是仅在内部类中用于范围解析的语法,并且此处指的是“我所属类Tracker的实例”。在引用“类”Tracker的情况下,因此您不能调用类本身的实例成员。test.parent.Tracker.track TrackerTracker