如何通过多级继承调用错误的覆盖方法?

时间:2010-11-02 04:13:01

标签: java inheritance

我有以下Java类结构。 (JDK 1.6.0_21)

Class C extends B` {
  //Nothing relevant
}

Class B extends A {
  public void clear() {
    // whatever
  }
}

Class A {
  public void clear() {
    // whatever
  }
}

我有一个类型为C的对象c。当我打电话给c.clear()时,它正在调用clear()类中的A方法,而不是类B。经过多次清理和构建之后,它开始在类B上使用clear方法,这是预期的。

在任何人说“你在改变A,B或C级之后你没有重建”之前。这些课程在3年内没有变化。我甚至添加了调试行来证明它正在调用A.clear(),这也证明它已被重新编译。

有没有人知道它会调用A.clear()而不是B.clear()的任何理由,还记得所有这三个类在几年内都没有变化吗?

编辑:A类和B类是最终放在jar文件中的库的一部分。类C位于Java应用程序中。这两个项目都在Eclipse中检出,并且在这个问题上多次编译 - 因为我在库中添加了调试并在Java应用程序中进行了调试。

再次编辑:类clear()中的B方法不使用super.clear(),也不应该使用{{1}}。

最终编辑:答案必须是存在某种编译/环境问题 - 如果Java的JDK存在某种影响继承模型的缺陷,那么会有更多的漏洞。在不暴露整个项目的情况下,我认为没有人能做到更多。感谢那些回答的人!

1 个答案:

答案 0 :(得分:1)

  

我甚至添加了调试行来证明它正在调用A.clear(),这也证明它已被重新编译。

不,不。调试器可以使用与部署的代码不同的代码运行。你只会看到错误的行,在最坏的情况下 - 相同的行(如果代码更改没有移动任何东西)

下次确保文件/广告的日期不在过去。