我有以下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()
,它是從A
類,而不是類B
調用clear()
方法。經過多次清理和構建之後,它開始在類B
上使用清除方法,這與預期相同。
在任何人聲明「您在更改A,B或C類後無法重建」之前。這些課程在3年內沒有變化。我甚至添加了調試行來證明它調用了A.clear()
,這也證明它已全部重新編譯。
有沒有人知道任何原因,它會一直呼籲A.clear()
而不是B.clear()
,記住所有這三個類都沒有改變多年?
編輯:類A和B是最終在一個jar文件中的庫的一部分。類C
在Java應用程序中。這兩個項目都在Eclipse中檢出,並且在此問題中被多次編譯 - 正如我在庫中添加調試並在Java應用程序中進行調試一樣。
重新編輯:類B
中的clear()
方法不使用super.clear()
,它也不應該。
最終編輯:答案必須是存在某種編譯/環境問題 - 如果Java的JDK存在某種影響繼承模型的缺陷,那麼會聽到更多的聲音。在沒有公開整個項目的情況下,我不認爲有更多的人可以做。感謝那些回答!
你在什麼環境中運行它?應用服務器?命令行?你在使用班級裝載機嗎? – TofuBeer 2010-11-02 04:16:49
這全部在Eclipse 3.6中完成A類和B類在一個很少被修改的庫中。我剛剛檢查了CVS,而這兩個類自2005年以來一直沒有變化。 C類處於使用包含A類和B類的庫的應用程序中.C類自2003年以來未更改。 – 2010-11-02 04:25:25
如果您尚未更改這3年中的任何一個,那麼問題是如何發展的?在構建系統中有沒有可能允許某人在單獨的jar中進行編譯的問題?如果開發人員在本地測試A/B變體並編譯C(我已經看到構建系統足夠糟糕以至於無法實現這個功能)?(longshot),您是否通過反射來確定任何類? – 2010-11-02 05:17:53