java - 如何在ArrayList中使用多态性?

标签 java arraylist polymorphism covariance contravariance

所以我有一个动物园程序,我想要一个动物园中的房间列表,以及每个房间中的猫列表。

我有 3 个类:FelidHousecatWildcat - HousecatWildcat扩展Felid。根据动物的字面类别(现在我有老虎、波斯猫、暹罗猫和猎豹 - 老虎和猎豹延伸野猫,波斯猫和暹罗猫延伸家猫)某些属性将自动分配。

类图 - /image/oDydn.jpg

例如,这些是 felid 的字段:

String speciesName;
String furColour;
String gender;
int weightPounds;
boolean packAnimal;
String habitat;
int age;

这些是 housecat 的字段:

String ownerName;
String catName;
boolean feral;

这些是野猫的字段:

boolean manEater;

在我的 housecat 构造函数中,我有

    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 将始终为 null,因为添加到列表中的家猫将仅算作“felid”类型。

如何创建一个列表,可以将所有猫放入其中,但仍将它们视为各自的类别?

编辑:感谢您指出赋值运算符错误,但它仍然只打印野性

最终编辑:非常感谢“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;
    }
}

最佳答案

if(feral = true){

这是一个赋值语句,而不是比较。使用 ==

关于java - 如何在ArrayList中使用多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30173183/

相关文章:

java - 找到所有可能的大数组对的 AND-Product 的最佳方法是什么?

java - 找出另一个数组列表中不存在的数组列表的元素

Java :Comparing two lists

java - char[] 的大小是多少?

java - 实现 Spring Security 后,Spring Boot ResponseBody 未序列化为 JSON

java - 为我的登录页面创建 session 并计算登录失败的次数

java - Android:Arraylist 声明期间出现问题

c++ - 覆盖虚函数的问题

java - 将子对象作为父参数发送

java - 方法重载 int 与 Short