在Java中,为什么创建新对象时父类有时在左侧?

twi*_*lco 0 java inheritance class object

我在理解Java的继承方面遇到了一些麻烦.我知道这样的事情是可能的,但它的目的是什么?

Animal pig0 = new Pig();

这里发生了什么?如果有人想在这个例子中创建一个新的Pig对象,为什么不这样做呢?

Pig pig0 = new Pig();

或者如果他们想要一个Animal对象,为什么不这样做呢?

Animal pig0 = new Pig();

允许这种事情的目的是什么,以及真正发生了什么?请注意,这些示例假定它Pig是.的子类Animal.

谢谢.

Cod*_*ind 5

因为Pigextends Animal,任何Animal引用都可以赋值给Pig.这被称为多态性.

那么你为什么要这样做呢?如果您编写的代码可以处理任何代码Animal,那么您可以将该代码重用于任何扩展名Animal,无论Animal您正在处理的是Pigs还是Goats或Elephants.

这也有助于信息隐藏的原则- 在许多情况下,您或者不需要知道您是在处理特定的子类,还是您不想知道.多态性使您可以在比必须处理特定Animal扩展时更抽象的层次上考虑代码设计.这是一个简单的例子:

static abstract class Animal{
    public abstract void speak();
}

static class Pig extends Animal{
    @Override public void speak(){ System.out.println("oink"); }
}

static class Goat extends Animal{
    @Override public void speak(){ System.out.println("baah"); }
}

static void converse(List<Animal> list){
    for(Animal a : list) System.out.println(a.speak());
}

public static void main(String[] args){
    List<Animal> l = new LinkedList<Animal>();
    l.add(new Pig());
    l.add(new Goat());
    converse(l);
}
Run Code Online (Sandbox Code Playgroud)

在命令行中,您将看到以下内容:

oink
baah
Run Code Online (Sandbox Code Playgroud)

即使我们List被定义为包含类型的实例,Animal每次调用时我们都会得到不同的行为,a.speak()因为列表中的第一项实际上是a Pig而第二项是a Goat.

这个代码片段中有第二个多态性的例子 - 我将把它作为练习留给你来弄清楚它在哪里:)