首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与继承相关的java中的堆栈溢出错误

与继承相关的java中的堆栈溢出错误
EN

Stack Overflow用户
提问于 2014-11-19 12:13:36
回答 3查看 332关注 0票数 0

我正在为我的java介绍类做一个项目,并且正在做继承工作。问题出在类MammalPet上。当我运行driver类时,我在第12行得到一个堆栈溢出错误,它调用MammalsetName(inName)。谁能给我指个方向?

代码语言:javascript
运行
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-11-19 12:15:52

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

代码语言:javascript
运行
复制
public void setName(String inName){
    setName(inName);//<-- recursive class
}

相反,如果您真的想覆盖它,请不要这样做

代码语言:javascript
运行
复制
@Override
public void setName(String inName){
    super.setName(inName);
}
票数 2
EN

Stack Overflow用户

发布于 2014-11-19 12:17:23

要调用超类方法,您应该编写:

代码语言:javascript
运行
复制
public void setName(String inName){
    super.setName(inName);
}

也就是说,如果子类只调用超类实现,那么您实际上不需要在子类中实现setName

票数 2
EN

Stack Overflow用户

发布于 2014-11-19 12:19:29

当你调用

代码语言:javascript
运行
复制
public void setName(String inName){
   setName(inName);
}

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

super.setName(inName);

但由于这是具有此预定义方法的父级的子级,因此您甚至不需要此方法,除非您希望此方法做一些不同的事情。这就是继承点。

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

https://stackoverflow.com/questions/27008832

复制
相关文章

相似问题

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