我的问题是,如果有一个由父类扩展的子类,并且由祖父类扩展,那么子类如何直接访问祖父的方法。
答案 0 :(得分: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字节码都不允许它。
答案 1 :(得分: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
}
}