【发布时间】:2015-08-08 04:19:57
【问题描述】:
这是来自一个更大的项目,因此我将简化结构并且不包括此处涉及的所有代码,但我想知道这在概念上是否可行,以及是否存在我可能遇到的潜在障碍有。
我有几个主类的子类,一个包含调用useEnergy()的方法age()(从顶级超类覆盖)。此类的直接子类覆盖 age()。该类的直接子类需要覆盖 useEnergy(),但被覆盖方法中的代码永远不会执行(使用 System.out.printlns 验证)。有趣的是,在有问题的类的超类中,如果我在其中重写 useEnergy(),则该类的代码会执行。从对象的所有类之外调用age()。层次结构图如下所示:
- World 对 Entity 对象数组调用 age()
- 实体声明age()
- OrganicEntity 扩展 Entity 并覆盖 age() 和代码 正确执行
- Organism 扩展 OrganicEntity 并覆盖 age() 并定义 在 age() 中调用的 useEnergy() 和正确的代码 执行
- AdvancedOrganism 扩展了 Organism 并覆盖了 age()(并包括 super.age() 调用)并且代码正确执行(作为测试, 覆盖 useEnergy() 也正确执行)
- 酵母扩展 AdvancedOrganism 并覆盖 useEnergy(),但从不 正确执行 useEnergy() 中的代码。作为测试,它也可以 不要在覆盖的 age() 方法中执行代码。
这个层次结构有问题吗?当在 World 中的 Entity 数组中的 Yeast 对象上调用 age() 时,我是否可以让 Yeast 中的 useEnergy() 中的代码执行?
Organism 的 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) ;
}
}
控制台从不显示“酵母能量!”即使它正确执行了 Organism 的 useEnergy() 中的代码。我还验证了 AdvancedOrganism 的其他子类表现出类似的行为。想法?
【问题讨论】:
-
它将被调用。相信这一点;向后工作。 (它真的是一个“酵母”对象吗?)
-
在实体对象数组中,实体对象的类型是什么?
-
超类的方法完全一样吗?即...不是私人的?
-
将
@Override放在子类方法上,以确保您没有手指肥大。
标签: java inheritance subclass overriding