【问题标题】:Stack overflow error in java concerning inheritancejava中有关继承的堆栈溢出错误
【发布时间】:2014-11-19 04:13:35
【问题描述】:

我正在为我的 java 类介绍做一个项目,并且正在研究继承。问题在于MammalPet 类。当我运行驱动程序类时,我在第 12 行遇到堆栈溢出错误,它调用 setName(inName)Mammal。有人能指出我正确的方向吗?

package inlab9;


/**
 * Driver for Inlab9.
 * 
 * @author yaw 
 * @version 14 Nov 2014
 */
public class Driver
{
    public static void main(String[] args)
    {
        Pet p = new Pet("Terrance");
        p.printInfo();
        System.out.println();

        Mammal m = new Mammal();
        m.printInfo();
        m.setName("Roxie");
        m.printInfo();
        System.out.println();

        Fish f = new Fish("red");
        f.printInfo();
        f.setName("Shark");
        f.printInfo();
        System.out.println();

        Dog d = new Dog("Watson", "Basset");
        d.printInfo();
    }
}

package inlab9;

public class Mammal extends Pet {
    protected static String name = "Fluffy";

    public Mammal(){
        super(name);
    }

    public void setName(String inName){
        setName(inName);
    }
    public void printInfo(){
        System.out.println("The pet's name is " +name);
    }
}

package inlab9;

public class Pet {
    protected String name;

    public Pet(String name){
        this.name = name;
    }

    public void printInfo(){
        System.out.println("The pets name is " + name);
    }
    public void setName(String name){
        this.name = name;
    }
}

【问题讨论】:

  • setName() 的实现看起来有点问题。
  • 除了答案之外,您的继承树还存在一些概念问题。例如,通过使Pet 成为Mammal 的超类,您是在说哺乳动物是宠物。有很多哺乳动物无法驯化。此外,一些Fish 可以是宠物。因此,最好将Pet 设为接口而不是类。请记住,当您走下继承树时,范围会变窄。这意味着子类是比其超类更具体的类型。您的示例中未遵守此规则。我知道这与您的问题无关,但需要观察。

标签: java inheritance stack flow


【解决方案1】:

要调用超类方法,你应该这样写:

public void setName(String inName){
    super.setName(inName);
}

也就是说,如果 setName 只调用超类实现,则实际上不需要在子类中实现它。

【讨论】:

    【解决方案2】:

    你的问题在这里,在哺乳动物类

    public void setName(String inName){
        setName(inName);//<-- recursive class
    }
    

    尝试,如果你真的想覆盖它,否则不要这样做

    @Override
    public void setName(String inName){
        super.setName(inName);
    }
    

    【讨论】:

    • 完美我不认为使用 super.setName。非常感谢
    【解决方案3】:

    当你打电话时

    public void setName(String inName){
       setName(inName);
    }
    

    您正在递归调用该方法并且没有中断来停止它,因此堆栈不断增加直到它溢出。您可能想在调用父类的方法之前尝试使用关键字super

    super.setName(inName);

    但是由于这是具有此预定义方法的父级的子级,因此您甚至不需要它,除非您希望此方法执行不同的操作。这就是继承的意义。

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2014-04-10
      相关资源
      最近更新 更多