2010-11-02 59 views
2

我有以下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存在某種影響繼承模型的缺陷,那麼會聽到更多的聲音。在沒有公開整個項目的情況下,我不認爲有更多的人可以做。感謝那些回答!

+1

你在什麼環境中運行它?應用服務器?命令行?你在使用班級裝載機嗎? – TofuBeer 2010-11-02 04:16:49

+0

這全部在Eclipse 3.6中完成A類和B類在一個很少被修改的庫中。我剛剛檢查了CVS,而這兩個類自2005年以來一直沒有變化。 C類處於使用包含A類和B類的庫的應用程序中.C類自2003年以來未更改。 – 2010-11-02 04:25:25

+0

如果您尚未更改這3年中的任何一個,那麼問題是如何發展的?在構建系統中有沒有可能允許某人在單獨的jar中進行編譯的問題?如果開發人員在本地測試A/B變體並編譯C(我已經看到構建系統足夠糟糕以至於無法實現這個功能)?(longshot),您是否通過反射來確定任何類? – 2010-11-02 05:17:53

回答

1

我甚至添加了調試行來證明它調用了A.clear(),這也證明它已經被重新編譯。

不,它不。調試器可以使用不同於所部署代碼的代碼運行。您只會看到錯誤的行,並在最壞的情況下 - 相同的行(如果代碼更改沒有移動任何東西)

下一次確保日期的文件/罐子不是以往。

+0

我個人將「調試行」理解爲調用System.out.println()或調用logger.debug(),而不是使用調試器。 – Damien 2010-11-02 13:20:51

+0

@Damien也許你是對的。但最初我認爲它是一個斷點。無論如何,沒有看到他們去過的地方,我不能說是否放置正確。 – Bozho 2010-11-02 13:32:52

+1

答案必須是存在某種編譯問題,如果Java的JDK存在某種影響繼承模型的缺陷,那麼會聽到更多的問題。 – 2010-11-02 21:46:56