代码之家  ›  专栏  ›  技术社区  ›  Weishi Z

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

  •  6
  • Weishi Z  · 技术社区  · 9 年前

    在所有的 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
            }
        });
      }
    
    }
    

    超一流的

    package test.parent;
    
    public abstract class Tracker {
    
    public void track(Event event) {}
    
    }
    

    参考更新:

    在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本身的内部类,则是编译时错误。”

    1 回复  |  直到 9 年前
        1
  •  3
  •   Weishi Z    9 年前

    你的 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 在run中,但如果需要访问的实例 跟踪器 那个 跟踪程序可运行 与您访问它的方式相关联 Tracker.this Tracker.super 只是 super 表示的超类 跟踪程序可运行 跟踪器 (在这种情况下 可运行 ).

    需要注意的是,这是只在内部类中用于范围解析的语法,并且 跟踪器 这里指的是“ 跟踪器 我所属的班级” test.parent.Tracker.track 跟踪器 指“ 跟踪器 类”,因此不能对类本身调用实例成员。