2

私の質問は、父クラスによって拡張された子クラスがあり、それが祖父クラスによって拡張されている場合、どのようにして子クラスが祖父のメソッドに直接アクセスできるかということです。

4

2 に答える 2

6

これは、例で最もよく示されています。

public class GF {
    public void one() { ... }
    public void two() { ... }
}

public class F extends GF {
    public void two() { ... }
}

public class C extends F {
    public void one() {
        super.one(); // Calls one in GF
    }

    public void two() { 
        super.two(); // Calls two in F
    }
}

サブクラス内からオーバーライドされたメソッドを呼び出すための構文はですsuper.method(....)。ただし、これを実行できるのは、最初のレベルのオーバーライドされたメソッドを呼び出す場合のみです。そのメソッド自体がオーバーライドである場合、第2レベルのオーバーライドを呼び出すことはできません。たとえば、C.two()を直接呼び出す方法はありませんGF.two()。反射的にそれを行うことはできず、JVMバイトコードでさえそれを許可しません。

于 2012-06-12T09:43:12.070 に答える
1

それは祖父のメソッドの可視性に依存します。一般に、父親の方法と同じようにアクセスできます。親の祖父メソッドのオーバーライドをスキップしたい場合、親を変更しないと実行できません。

祖父のメソッドを呼び出す唯一の方法は次のようになります。

public class GF {
    public void m() {
        //do something
    }
}

public class F {

    public void m() {
        //do something that you don't need in son
    }

    /* add this method for the clean access to GF*/
    public void gfM() {
        super.m();
    }
}

public class S {
    public void aMethod() {
        gfM(); //actually calls the GF.m() method
    }
}
于 2012-06-12T09:29:11.697 に答える