【发布时间】:2015-07-22 06:47:21
【问题描述】:
所以我有这个动物园程序,我想要一个动物园房间列表,以及每个房间里的猫列表。
我有 3 个类:Felid、Housecat 和 Wildcat - Housecat 和 Wildcat 扩展 Felid。根据动物的字面类别(现在我有老虎、波斯、暹罗和猎豹 - 老虎和猎豹扩展野猫,波斯和暹罗扩展家猫)某些属性将被自动分配。
类图 - http://i.imgur.com/VTSNRVA.jpg
例如,这些是 felid 的字段:
String speciesName;
String furColour;
String gender;
int weightPounds;
boolean packAnimal;
String habitat;
int age;
这些是housecat 的字段:
String ownerName;
String catName;
boolean feral;
这些是 wildcat 的字段:
boolean manEater;
在我的家猫构造函数中,我有
if(catName == null || catName.equals("")){
feral = true;
}
如果猫是野生的,当用户创建一个带有猫名的 HouseCat 并使用'printCatInfo()'时:
@Override
public void printCatInfo(){
if(feral){
System.out.println("feral" + "\n" + speciesName + "\n" + furColour + "\n" + gender +
"\n" + weightPounds + "lbs\n" + "is not a pack animal" + "\n" + habitat + "\n" + age + " years old (human)");
}
else{
System.out.println("owner name is: " + ownerName + "\n" + "cat name is: " + catName + "\n" + speciesName + "\n" + furColour + "\n" + gender +
"\n" + weightPounds + "lbs\n" + "is not a pack animal" + "\n" + habitat + "\n" + age + " years old (human)" + "\n");
}
}
它不会打印它的名字。
feral
siamese
White or grey abdomen with black legs, face and tail
male
8lbs
is not a pack animal
urban
7 years old (human)
问题在于它将所有猫都算作野猫,我认为这是因为我用于猫列表的列表是:
ArrayList<Felid> catList = new ArrayList<Felid>();
所以我猜 catName 将始终为空,因为添加到列表中的家猫只会算作“猫”类型。
如何创建一个列表,我可以将所有猫都扔到其中,但仍将它们视为各自的类?
编辑:感谢您指出赋值运算符错误,但它仍然只是打印野性
最终编辑:非常感谢“DoubleDouble”向我指出如何使用“Super()”——这不是我预期的问题所在。这就是问题所在:
public class Siamese extends HouseCat{
public Siamese(int weightPounds, int age, String ownerName, String catName, String gender){
this.speciesName = "siamese";
this.furColour = "White or grey abdomen with black legs, face and tail";
this.ownerName = ownerName;
this.catName = catName;
this.weightPounds = weightPounds;
this.age = age;
this.gender = gender;
}
}
新代码:
public class Siamese extends HouseCat{
public Siamese(int weightPounds, int age, String ownerName, String catName, String gender){
super(catName);
this.speciesName = "siamese";
this.furColour = "White or grey abdomen with black legs, face and tail";
this.ownerName = ownerName;
this.catName = catName;
this.weightPounds = weightPounds;
this.age = age;
this.gender = gender;
}
}
【问题讨论】:
-
所有的家猫都是为了野性,对吧?我看不出你会在哪里分配
HouseCat和catName。在任何情况下,由于它使用printCatInfo的覆盖形式并打印“野性”,它使用HouseCat类(或子类)而不是Felid类的printCatInfo -
@DoubleDouble HouseCat 子类的构造函数是(例如):public Siamese(int weightPounds, int age, String ownerName, String catName, String gender)
-
你在你的子类中调用
super(...)吗?如果您依赖默认构造函数,它将在子类构造函数之前调用 - 这意味着您的catName可能尚未分配。 -
@DoubleDouble 哦,所以我猜父类的构造函数首先被调用/分配?但是在“暹罗”类中为猫分配了它的名字后,我无法调用 super。那么我该如何执行: if(catName == null || catName.equals("")){ feral = true; } 之前 this.catName = catName; ?
-
我认为您的意思是“之后”,但我已经详细说明了 solution in my answer
标签: java arraylist polymorphism covariance contravariance