调用子类构造函数时来自子类或超类的数据类型



我是java的新手,我试图制作一个简单的多态性程序。

public abstract class Animal {
public abstract void action();
}

public class Cow extends Animal {
@Override
public void action() {
System.out.println("Im a cow.");
}
}
public class Sheep extends Animal {
@Override
public void action() {
System.out.println("Im a sheep.");
}
}
1 import java.util.ArrayList;
2
3 public class Main {
4
5   public static void main(String[] args) {
6       ArrayList<Animal> animals = new ArrayList<Animal>();
7       Animal cow = new Cow();
8       Animal sheep = new Sheep();
9       animals.add(cow);
10      animals.add(sheep);
11
12      for (Animal animal : animals) {
13          animal.action();
14      }
15  }
16 }

我想知道这与将数据类型从第7行更改为Cow->Cow cow = new Cow();和将数据类型从不第8行更改为Sheep->Sheep sheep = new Sheep();之间是否有区别。我很好奇,因为输出完全相同。

没有区别,cow变量只是用于将其添加到ArrayList<Animal>中。

由于Cow变量可能有Animal中没有的其他方法,但在语义上它们的行为是等效的,因此根据具体的使用情况可能会有所不同。

唯一的区别是允许对cow变量调用什么。

一般来说,最好尽可能使用最不特定的类型,这样你就可以确保你没有使用任何你不想使用的特定功能。同样的原理也适用于animals变量,更好的声明是:

List<Animal> animals = new ArrayList<>();

最新更新