当前位置: 首页 > 知识库问答 >
问题:

Java-未调用子类覆盖的方法

薛飞星
2023-03-14

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

我从主类中得到了几个级别的子类,其中一个级别包含方法age()(从顶部超类重写),该方法调用useEnergy()。此类的直接子类重写age()。该类的直接子类需要重写useEnergy(),但被重写方法中的代码永远不会执行(通过System.out.printlns验证)。有趣的是,在有问题的类的超类中,覆盖age()的超类,如果我在其中覆盖usenergy(),则该类的代码将执行。age()在对象上从所有类的外部调用。层次图如下所示:

  • World在一组实体对象上调用age()

这个层次结构有问题吗?当age()在世界范围内的一个实体数组中的一个酵母对象上被调用时,我是否可以获得酵母中useEnergy()中的代码来执行?

有机体的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) ;
        }
    }

控制台从不显示“酵母能量!”即使它正确执行生物体的useEnergy()中的代码。我还验证了AdvancedOrganism的其他亚类也表现出类似的行为。思想?

共有1个答案

谭灿
2023-03-14

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

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

我补充道:

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

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

现在它运行正常!

 类似资料:
  • 问题内容: 假设我在Java类中有一个方法,并且我不希望该类的任何子类能够覆盖该方法。我可以那样做吗? 问题答案: 您可以将方法声明为,如: 有关更多信息,请参见http://docs.oracle.com/javase/tutorial/java/IandI/final.html

  • 如果类A中的方法调用类B中的父方法,该方法调用类B中的方法X,该方法X在类A中被重写,将调用方法X的哪个实现?子类A中的重写实现还是父类B中的原始实现? 从我的代码中,我看到重写方法被调用,但是我想象如果一个方法是从一个类中调用的,那么这个方法就不会是子类中的重写方法。我猜如果一个子类调用父类中的一个方法,该方法调用子类中重写的方法,重写的方法将被调用?那是对的吗?为什么啊?

  • 问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译

  • 我有一个实现可比较接口的类A,和一个扩展A的类B。我需要找到一种方法来覆盖类B中的。 我发现了一个类似的问题不能用可比的父子孙继承并试图实施提供的解决方案 A类: B类: 例外情况: 线程“main”java中出现异常。lang.ClassCastException:T4级。A不能转换为T4级。B(T4.A和T4.B在加载器“app”的未命名模块中)

  • 我正在开发一个Java中的图形库(https://github.com/aisthesis/java-graph2012 完整的上下文),并且需要覆盖权重边缘类的hashCode(),其中边缘不定向。也就是说,我设置了我的 equals() 覆盖方法,以便对于 2 个加权边 e1 和 e2,如果以下条件之一成立(from() 和 to() 方法返回边的尾部和头顶点),则它们相等: e1.从() =

  • 问题内容: 我有一个类,它符合协议并实现了功能。在子类中,我将进行更多检查。 但是,当我在两个实例数组(都具有类型)之间进行比较时,会调用for 。当然,如果我将两个数组的类型都更改为,则会调用for 。 我想出了以下解决方案: 看起来真的很丑,必须为的每个子类进行扩展。有没有办法确保首先调用for子类? 问题答案: 为包含的平等调用for的原因是,自由函数的重载是静态解决的,而不是动态解决的-