這是來自一個更大的項目,所以我要簡化結構並且不包含所有涉及的代碼,但是我想知道這個概念是否會起作用,如果我可能會遇到潛在的障礙。Java - 子類重寫方法不叫
我有幾個級別的主類的子類,一個級別包含調用useEnergy()方法age()(從頂級超類覆蓋)。此類的直接子類覆蓋age()。該類的直接子類需要重寫useEnergy(),但重寫方法中的代碼從不執行(通過System.out.printlns進行驗證)。有趣的是,在有問題的類的超類中,一個覆蓋age(),如果我在那裏覆蓋useEnergy(),則該類的代碼將執行。 age()從所有類之外的對象中調用。層次結構圖如下所示:實體的陣列上
- 世界呼籲年齡()對象
- 實體聲明瞭年齡()
- OrganicEntity擴展實體和覆蓋的年齡()和代碼 正確執行
- 生物延伸OrganicEntity並覆蓋年齡(),並且限定 useEnergy(),其年齡內()調用和所述代碼正確 執行
- AdvancedOrganism延伸有機體並覆蓋年齡() (並且包括 super.age()調用)和碼正確執行(作爲測試, 壓倒一切useEnergy()也正確執行)
- 酵母延伸AdvancedOrganism並覆蓋useEnergy(),但從未 正確地執行該代碼在useEnergy()中。作爲測試,它也不會在覆蓋的age()方法中執行代碼。
這個層次結構有問題嗎?有什麼我可以得到的代碼在酵母中useEnergy()執行age()時在世界範圍內的實體數組中的Yeast對象上調用嗎?
對生物體的useEnergy(實際代碼)(工作)是:
public void useEnergy(){ //Called every hungerTime, by default
energy-- ;
heat++ ;
nutrientReduction() ;
}
和酵母(不工作)被重載的方法是:
public void useEnergy(){
Random rand = new Random() ;
super.useEnergy() ;
System.out.println("Yeast energy!") ;
if(rand.nextInt(100) < 5){
toxicity += 6 ;
emitToxins(1) ;
}
}
控制檯永遠不會顯示「酵母能源!」即使它正確地執行生物體的useEnergy()中的代碼。我還證實AdvancedOrganism的其他子類表現出類似的行爲。想法?
它會被調用。相信;向後工作。 (它是否真的是'酵母'對象?) – user2864740
在實體對象數組*中,實體對象的類型是什麼? –
是超類方法完全一樣嗎?即...不是私人的? – Pumphouse