关于覆盖:Java如何调用祖父母的方法?

Java How to call method of grand parents?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why is super.super.method(); not allowed in Java?

假设我有3个类:ABC,每个类都扩展了前一个类。

如果B也实现myMethod的话,如何从C.myMethod()调用A.myMethod()中的代码?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class A
{
  public void myMethod()
  {
    // some stuff for A
  }
}

class B extends A
{
  public void myMethod()
  {
    // some stuff for B
    //and than calling A stuff
    super.myMethod();
  }
}

class C extends B
{
  public void myMethod()
  {
    // some stuff for C
    // i don't need stuff from b, but i need call stuff from A
    // something like: super.super.myMethod(); ?? how to call A.myMethod(); ??
  }
}


你不能。这是故意的。

类EDCOX1(0)提供一个接口(如概念,而不是Java关键字)到子类。它选择不直接访问A.myMethod的功能。如果您需要B来提供该功能,那么对它使用不同的方法(不同的名称,使其成为protected)。然而,最好是"更喜欢组合而不是继承"。


你不能,你也不应该。

这是设计不好的标志。要么重命名一个方法,要么在另一个方法或实用程序类中包含所需的公共功能。


我不确定你能不能。Java使所有方法在默认情况下都是虚拟的。这意味着最简单的解决方案将不起作用:声明一个A类型的变量,将您的C实例赋给它,调用myMethod将导致C.myMethod被调用。

您可以尝试反射类型A并直接调用其方法。在这种情况下看到会发生什么是很有趣的,但是如果虚拟调度不会发生,我会感到惊讶…