2015-08-08 58 views
0

這是來自一個更大的項目,所以我要簡化結構並且不包含所有涉及的代碼,但是我想知道這個概念是否會起作用,如果我可能會遇到潛在的障礙。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的其他子類表現出類似的行爲。想法?

+0

它會被調用。相信;向後工作。 (它是否真的是'酵母'對象?) – user2864740

+0

在實體對象數組*中,實體對象的類型是什麼? –

+0

是超類方法完全一樣嗎?即...不是私人的? – Pumphouse

回答

0

謝謝您的意見!事實確實如此。我自己說服了,因爲在酵母構造函數中,有特定於類的設置(如名稱字符串)被正確傳遞,但我通過每個超類中的newCopy()方法生成新對象,當前對象使用複製構造函數(傳遞一個對象作爲參數複製並複製所有屬性)。我沒有重新定義newCopy來返回Yeast對象,而是程序使用了AdvancedOrganism的newCopy方法,該方法複製了酵母的所有屬性,但實際上並未返回Yeast對象,它返回了具有所有Yeast屬性的AdvancedOrganism對象。

我之前沒有遇到過這個問題,因爲AdvancedOrganism的其他子類只是一些預設變量的默認構造函數 - 沒有像拷貝它們那樣的實際方法,如果它們是AdvancedOrganisms沒有造成問題。

我說:

Yeast(Yeast parentOrganism){ 
    super(parentOrganism.xLocation, parentOrganism.yLocation, parentOrganism.zLocation, parentOrganism) ; 
} 

public Yeast newCopy(){              //Important for SpawnRandomizer 
    return new Yeast(this) ; 
} 

,現在它的正確操作!