了解使用Super访问Superclass成员

时间:2013-09-21 15:48:05

标签: java super

我指的是java语言规范,以了解super的用法。虽然我理解第一个用例,即

  

表单super.Identifier引用当前对象的名为Identifier的字段,但将当前对象视为当前类的超类的实例。

我似乎无法理解以下用例:

  

表单T.super.Identifier引用与T对应的词汇封闭实例的名为Identifier的字段,但该实例被视为T的超类的实例。

有人可以借助代码解释一下吗?

我认为以下内容可以说明第二种情况:

class S{
    int x=0;
}

class T extends S{
    int x=1;
    class C{
        int x=2;
        void print(){

            System.out.println(this.x);
            System.out.println(T.this.x);
            System.out.println(T.super.x);
        }
    }
    public static void main(String args[]){
        T t=new T();
        C c=t.new C();
        c.print();
    }
}

输出: 2 1 0

1 个答案:

答案 0 :(得分:2)

我认为它适用于这种情况

public class Main {
    static class Child extends Parent{
        class DeeplyNested {
            public void method() {
                Child.super.overriden();
            }
        }

        public void overriden() {
            System.out.println("child");
        }
    }
    static class Parent {
        public void overriden() {
            System.out.println("parent");
        }
    }
    public static void main(String args[]) {
        Child child = new Child();
        DeeplyNested deep = child.new DeeplyNested();
        deep.method();
    }
}

在JLS

  

表单T.super.Identifier是指名为Identifier of的字段   对应于T的词汇封闭实例,但有了这个   实例被视为T的超类的实例。

Identifieroverriden,方法。

此处,lexically enclosing instance的类型为Child,其超类为Parent。因此,T.super是指Child被视为Parent的实例。

上面的代码打印

parent