6

super の使い方を理解するために Java 言語仕様を参照していました。私は最初のユースケースを理解していますが、つまり

フォームsuper.Identifierは現在のオブジェクトの Identifier という名前のフィールドを参照しますが、現在のオブジェクトは現在のクラスのスーパークラスのインスタンスとして表示されます。

次の使用例を理解できないようです。

フォームT.super.Identifierは、 に対応する字句的に囲んでいるインスタンスの Identifier という名前のフィールドを参照しますTが、そのインスタンスは のスーパークラスのインスタンスとして表示されますT

誰かがコードの助けを借りてこれを説明できますか?

2番目のケースの例として、次のことが考えられます。

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

4

1 に答える 1

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 の形式は、T に対応する字句的に囲んでいるインスタンスの Identifier という名前のフィールドを参照しますが、そのインスタンスは T のスーパークラスのインスタンスとして表示されます。

Identifieroverriden、方法です。

ここで、lexically enclosing instanceは タイプChildであり、そのスーパークラスはParentです。soはとして表示されT.superたインスタンスを参照します。ChildParent

上記のコードが出力されます

parent
于 2013-09-21T16:14:00.847 に答える