Java - 新线程 Runnable 中的超级关键字 - 通过 class 引用非静态方法
Java - super keyword in new thread Runnable - refers non static method thru class
在我在网上找到的所有 super
关键字教程中,很难找到更接近以下示例的示例。
我的问题:
Tracker.super.track(event);
和 test.parent.Tracker.track(event);
有什么区别?
为什么第一个有效?
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。您可以将 TrackerRunnable
的 this
引用为 运行 中的 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 本身上调用实例成员。
在我在网上找到的所有 super
关键字教程中,很难找到更接近以下示例的示例。
我的问题:
Tracker.super.track(event);
和test.parent.Tracker.track(event);
有什么区别?为什么第一个有效?
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。您可以将 TrackerRunnable
的 this
引用为 运行 中的 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 本身上调用实例成员。