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(....). 但是你只能这样做来调用第一级覆盖的方法。如果该方法本身是一个覆盖,那么您不能调用第二级覆盖;例如,没有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 回答