gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:29 25 4
gpt4 key购买 nike

在我在网上找到的所有 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
}
});
}

}

父类(super class)

package test.parent;

public abstract class Tracker {

public void track(Event event) {}

}

引用更新:

在jls8, 15.11.2

“假设字段访问表达式 T.super.f 出现在类 C 中,并且由 T 表示的类的直接父类(super class)是一个完全限定名称为 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());
}
}

在 Java 中,内部类也有对其“所属”的外部类的引用。您可以在运行中将 this 用于 TrackerRunnable 作为 this 引用,但是如果您需要访问 Tracker 的实例如果 TrackerRunnable 与您相关联,您将以 Tracker.this 的形式访问它。 Tracker.super 也一样。只是 super 表示 TrackerRunnable 的父类(super class),而不是 Tracker(在本例中为 Runnable)。

主要要注意的是,这是仅在内部类中用于范围解析的语法,这里的 Tracker 指的是“Tracker 的实例> 我所属的类(class)”。对于 test.parent.Tracker.track Tracker 指的是“Tracker 类”,所以你不能调用实例成员类本身。

关于Java - 新线程中的 super 关键字 Runnable - 通过类引用非静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38385901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com