Java 如何通过多个继承级别调用错误的重写方法?

Java 如何通过多个继承级别调用错误的重写方法?,java,inheritance,Java,Inheritance,我有以下Java类结构。(JDK 1.6.0_21) 我有一个类型为c的对象c。当我调用c.clear()时,它是从类A调用clear()方法,而不是从类B调用。经过几次清理和构建之后,它开始在类B上使用clear方法,这与预期的一样 在任何人说“你不能在改变了A类、B类或C类后重建”之前。这些课程已经三年没变了。我甚至添加了调试行来证明它正在调用A.clear(),这也证明它已经被重新编译过了 有人知道它为什么会调用A.clear()而不是B.clear(),记住这三个类多年来都没有改变吗 编

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

我有一个类型为c的对象c。当我调用
c.clear()
时,它是从类
A
调用
clear()
方法,而不是从类
B
调用。经过几次清理和构建之后,它开始在类
B
上使用clear方法,这与预期的一样

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

有人知道它为什么会调用
A.clear()
而不是
B.clear()
,记住这三个类多年来都没有改变吗

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

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


最终编辑:答案必须是存在某种编译/环境问题——如果Java的JDK有某种影响继承模型的缺陷,那么人们会更多地听说它。如果不公开整个项目,我认为任何人都做不到更多。感谢那些回答的人

我甚至添加了调试行来证明它调用了A.clear(),这也证明它已经全部重新编译过

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


下次请确保文件/jar的日期不是过去

您在什么环境中运行它?应用服务器?命令行?你在使用类加载器吗?这都是在Eclipse3.6中完成的,类A和类B在一个很少修改的库中。我刚刚检查了CVS,这两个类自2005年以来一直没有改变。类C位于使用包含类A和B的库的应用程序中。类C自2003年以来从未更改过。如果您在3年内没有更改过任何一个,那么问题是如何发展的?您的构建系统中是否存在允许某人针对单独的jar进行编译的异常情况?如果一个开发人员正在本地测试a/B的一个变体,并根据该变体编译C(我已经看到构建系统糟糕到足以允许这种情况),那该怎么办?(longshot)你是通过反射来确定类的吗?我一直在回溯,实际上我们使用类加载器来调用包含类C的java应用程序的主方法。不要认为这会改变什么,但我对类加载器了解不多。如果没有看到所有的kazillion行,这可能是一个很遗憾的情况在这个项目中,你们可以做的不多。我个人认为“调试行”是对System.out.println()的调用或对logger.debug()的调用,而不是使用调试器。@Damien也许你是对的。但最初我认为它是一个断点。无论如何,在没有看到它们的位置的情况下,我不能说它们是否被正确放置。答案必须是存在某种编译问题,如果Java的JDK有某种影响继承模型的缺陷,那么可能会出现这种问题更多地听说过它。
Class C extends B` {
  //Nothing relevant
}

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

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