摘要 类 及其在 Java 中的 children 出现问题。真糊涂

Trouble with Abstract classes and their children in Java. Really confused

嗨,我是 java 的新手,遇到了一些问题。我有一个问题,但我不确定如何表达它,所以我试着举个例子。

首先假设我有三个共享同一个包的 classes。 首先假设我有以下摘要 class:

public abstract class Animal {
    protected String name;
    protected String type;

    public String getType() {
        return this.type;
    }
}

以及下面的childclass

public class Lion extends Animal {
    
    public Animal (String name, String dietType) {
        this.name = name;
        this.type = dietType;

}

然后假设我有另一个 class 跟踪与 Lion 和 Animal 共享相同包的动物列表。 class 有一种方法可以将动物添加到它拥有的 ArrayList 中。问题是当我尝试在 class 中创建一个 Lion(一种动物)并将其添加到 ArrayList of Animals 时它不会添加。

public class AnimalList {
    private ArrayList<Animal> animalList = new ArrayList<Animal>();

    public void addAnimal(Animal animal) {
        Lion lion1 = new Lion("Simba", "Carnivore");
        animalList.add(lion1);
    }
}

如果我想将 Lion 添加到动物的 ArrayList 中,我该怎么做?我是否必须将狮子塑造成动物?但是狮子已经是动物了不是吗?

只有一个重大问题会阻止您的代码在语法上正确且可运行。您在 Lion class 中错误地命名了构造函数。 class 应该这样定义:

public class Lion extends Animal {
    
    public Lion (String name, String dietType) {
        this.name = name;
        this.type = dietType;

}

另一个问题是意图。正如@Nickolai 所说,您可能不想在 AnimalList class 中添加特定的动物,而是添加您传入的 Animal,所以只需:

public class AnimalList {
    private ArrayList<Animal> animalList = new ArrayList<Animal>();

    public void addAnimal(Animal animal) {
        animalList.add(animal);
    }
}

为了完成图片,这里有一个 main 方法可以练习您的代码:

public static void main(String[] args) {
    AnimalList al = new AnimalList();
    Lion lion1 = new Lion("Simba", "Carnivore");
    al.addAnimal(lion1);
}

这段代码基本上回答了你的问题。是的,Lion 已经是 Animal,所以不需要类型转换就可以将 Lion 传递给 addAnimal 方法,即使它接受 Animal作为参数。