【发布时间】:2014-11-19 04:13:35
【问题描述】:
我正在为我的 java 类介绍做一个项目,并且正在研究继承。问题在于Mammal 和Pet 类。当我运行驱动程序类时,我在第 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