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

Java - super keyword in new thread Runnable - refers non static method thru class

在我在网上找到的所有 super 关键字教程中,很难找到更接近以下示例的示例。 我的问题:

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

  2. 为什么第一个有效?

  3. Tracker.super指的是什么?对象或 class?

子class:

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
        }
    });
  }

}

超级class

package test.parent;

public abstract class Tracker {

public void track(Event event) {}

}

参考更新:

在jls8, 15.11.2

”假设在classC中出现了一个字段访问表达式T.super.f,T表示的class的直接superclass是一个 class,其完全限定名称是 S。如果 S 中的 f 可从 C 访问,则 T.super.f 被视为好像它是 [=60 正文中的表达式 this.f =] S. 否则会出现编译时错误

因此,T.super.f 可以访问在 class S 中可访问的字段 f,即使该字段被 [=60] 中的字段 f 的声明隐藏=] T.

如果当前 class 不是 class T 的内部 class 或 T 本身,则会出现编译时错误。"

您的 run() 方法在 Runnable 的匿名子 class 中,它也是 Tracker 的内部 class。

效果相同
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()); 
  }
}

在 Java 中,一个内部 class 也引用了它 "belongs" 指向的外部 class。您可以将 TrackerRunnablethis 引用为 运行 中的 this,但是如果您需要访问 Tracker 的实例,那么 TrackerRunnable 是与您关联的人将以 Tracker.this 的形式访问它。与 Tracker.super 相同。只是 super 表示 TrackerRunnable 的超 class 而不是 Tracker(在本例中为 Runnable)。

主要要注意的是,这是仅在内部classes中用于范围解析的语法,这里的Tracker指的是"The instance of the Tracker class that I belong to"。在 test.parent.Tracker.track Tracker 引用 "the Tracker class" 的情况下,您不能在 class 本身上调用实例成员。