Java - 未调用子类重写方法

时间:2015-08-08 04:19:57

标签: java inheritance subclass method-overriding

这是来自一个更大的项目,所以我将简化结构,不包括这里涉及的所有代码,但我想知道这在概念上是否有效,如果有潜在的障碍,我可能会具有

我从主类有几个级别的子类,一个级别包含调用useEnergy()的方法age()(从顶级超类重写)。此类的直接子类重写age()。该类的直接子类需要覆盖useEnergy(),但重写方法中的代码永远不会执行(使用System.out.printlns进行验证)。有趣的是,在有类问题的类的超类中,一个覆盖age(),如果我在那里覆盖useEnergy(),那么该类的代码就会执行。 age()从对象的所有类外部调用。层次结构图看起来像这样:

  • World在实体对象数组中调用age()
  • 实体声明年龄()
  • OrganicEntity扩展了Entity并覆盖了age()和代码 正确执行
  • 有机体扩展了OrganicEntity并覆盖了age()和定义 useEnergy()在age()内调用,代码正确 执行
  • AdvancedOrganism扩展了有机体并覆盖了年龄()(包括一个 super.age()调用)并且代码正确执行(作为测试, 重写useEnergy()也正确执行)
  • Yeast扩展了AdvancedOrganism并覆盖了useEnergy(),但绝不会 正确执行useEnergy()中的代码。作为测试,它也有 不要在重写的age()方法中执行代码。

这个层次结构有问题吗?有什么东西可以让Yeast中的useEnergy()中的代码在世界范围内的实体数组中的Yeast对象上调用age()时执行吗?

Organism的useEnergy()(工作)的实际代码是:

public void useEnergy(){                                                //Called every hungerTime, by default
        energy-- ;
        heat++ ;
        nutrientReduction() ;
    }

和Yeast中的重写方法(不工作)是:

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的其他子类表现出类似的行为。想法?

1 个答案:

答案 0 :(得分:0)

感谢您的评论!事实确实如此。我自己也说服了,因为在Yeast构造函数中,有正确传递的特定于类的设置(如名称String),但我通过每个返回副本的超类中的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) ;
}

现在它正常运作!