Java - 新线程中的超级关键字Runnable - 通过类引用非静态方法

Wei*_*eng 6 java super runnable

super我在网上找到的所有关键词教程中,很难让任何一个例子更接近于一个.我的问题:

  1. Tracker.super.track(event);和之间有什么区别test.parent.Tracker.track(event);

  2. 为什么第一个工作?

  3. 什么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本身的内部类,那么这是一个编译时错误."

Dar*_*ark 3

您的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 TrackerRunnablethis但如果您需要访问与 关联的实例,TrackerTrackerRunnable可以将其访问为Tracker.this。同样的事情与Tracker.super. 只是意味着notsuper的超类(在本例中是)。TrackerRunnableTrackerRunnable

主要要注意的是,这是仅在内部类中用于范围解析的语法,并且此处指的是“我所属类Tracker的实例”。在引用“类”Tracker的情况下,因此您不能调用类本身的实例成员。test.parent.Tracker.track TrackerTracker