【问题标题】:Java - subclass overridden method is not calledJava - 不调用子类覆盖的方法
【发布时间】: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


【解决方案1】:

感谢cmets!结果确实是这样。我自己说服了自己,因为在酵母构造函数中,有正确传递的特定于类的设置(如名称字符串),但我一直在通过每个超类中的 newCopy() 方法生成新对象,该方法返回使用复制构造函数的当前对象(将要复制的对象作为参数传递并复制所有属性)。我没有重新定义 newCopy 以返回 Yeast 对象,而是该程序使用 AdvancedOrganism 的 newCopy 方法复制了 Yeast 的所有属性,但实际上并没有返回 Yeast 对象,它返回了一个 AdvancedOrganism 具有所有 Yeast 属性的对象。

我之前没有遇到过这个问题,因为 AdvancedOrganism 的其他子类只是带有一些预设变量的默认构造函数 - 没有实际方法,因此将它们复制为 AdvancedOrganisms 不会造成问题。

我补充说:

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

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

现在它运行正常!

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多