代码之家  ›  专栏  ›  技术社区  ›  kharesp

了解使用Super访问Superclass成员

  •  6
  • kharesp  · 技术社区  · 11 年前

    我参考了java语言规范来理解super的使用。虽然我理解第一个用例,即。

    表格 super.Identifier 指的是当前对象的名为Identifier的字段,但当前对象被视为当前类的超类的实例。

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

    表格 T.super.Identifier 是指对应于的词法封闭实例的名为Identifier的字段 T ,但该实例被视为的超类的实例 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 回复  |  直到 11 年前
        1
  •  2
  •   Sotirios Delimanolis    11 年前

    我相信这适用于这种情况

    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的字段 对应于T的词法封闭实例,但带有 被视为T的超类的实例。

    Identifier overriden ,方法。

    在这里 lexically enclosing instance 属于类型 Child 它的超类是 Parent 所以 T.super 指的是 小孩 视为 父母亲 .

    上面的代码打印

    parent