首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不调用Java子类重写方法。

不调用Java子类重写方法。
EN

Stack Overflow用户
提问于 2015-08-08 04:19:57
回答 1查看 3.6K关注 0票数 0

这是一个大得多的项目,所以我将简化结构,不包括这里涉及的所有代码,但我想知道这个概念是否有效,以及我可能遇到的潜在障碍。

我有几个来自主类的子类级别,一个级别包含方法age() (从顶级超类重写),它调用useEnergy()。该类的直接子类覆盖age()。该类的直接子类需要重写useEnergy(),但重写方法中的代码从不执行(用System.out.printlns验证)。有趣的是,在有问题的类的超类中,如果我在其中覆盖useEnergy(),那么来自该类的代码将执行。age()是从对象的所有类的外部调用的。层次图如下所示:

  • 在实体对象数组上调用age()
  • 实体声明age()
  • OrganicEntity扩展实体并重写age(),代码正确执行
  • 有机体扩展了OrganicEntity并覆盖age()并定义了useEnergy(),它在age()内被调用,代码正确执行
  • AdvancedOrganism扩展了有机物并重写了age() (并且包括一个super.age()调用),代码正确地执行(作为测试,重写useEnergy()也正确执行)
  • 酵母扩展AdvancedOrganism并重写useEnergy(),但从未正确地执行useEnergy()中的代码。作为测试,它也不会在重写的age()方法中执行代码。

这个层次结构有问题吗?是否有什么可以让酵母中的useEnergy()中的代码在对来自世界的实体的数组中的酵母对象调用age()时执行?

有机体的useEnergy() (工作)的实际代码是:

代码语言:javascript
复制
public void useEnergy(){                                                //Called every hungerTime, by default
        energy-- ;
        heat++ ;
        nutrientReduction() ;
    }

在酵母中被覆盖的方法(不起作用)是:

代码语言:javascript
复制
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的其他子类表现出类似的行为。想法?

EN

回答 1

Stack Overflow用户

发布于 2015-08-08 04:49:57

谢谢您的评论!结果确实是这样。我自己也不这么认为,因为在酵母构造函数中,有一些特定于类的设置(比如名称字符串)是正确传递的,但我一直在通过每个超类中的newCopy()方法生成新对象,该方法使用一个副本构造函数返回当前对象的副本(将一个对象作为参数复制并复制所有属性)。我没有重新定义newCopy来返回酵母对象,而是使用AdvancedOrganism的newCopy方法复制了酵母的所有特性,但实际上没有返回酵母对象,而是返回了包含酵母所有特性的AdvancedOrganism对象。

我以前没有遇到这个问题,因为AdvancedOrganism的其他子类只是一个默认的构造函数,带有一些预置变量--没有实际的方法,所以如果它们是AdvancedOrganisms,就不会产生问题。

我补充说:

代码语言:javascript
复制
Yeast(Yeast parentOrganism){
    super(parentOrganism.xLocation, parentOrganism.yLocation, parentOrganism.zLocation, parentOrganism) ;
}

代码语言:javascript
复制
 public Yeast newCopy(){                                                        //Important for SpawnRandomizer
    return new Yeast(this) ;
}

现在它运行正常了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31889601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档