gpt4 book ai didi

java - 在Java中,为什么创建新对象时父类有时会在左边?

转载 作者:行者123 更新时间:2023-12-01 08:00:10 24 4
gpt4 key购买 nike

我在理解 Java 的继承方面遇到了一些困难。我知道这样的事情是可能的,但这样做的目的是什么?

动物pig0 = new Pig();

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

Pig pig0 = new Pig();

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

动物pig0 = new Pig();

允许这种事情发生的目的是什么,到底发生了什么?请注意,这些示例假设 PigAnimal 的子类。

谢谢。

最佳答案

因为 Pig 扩展了 Animal,任何 Animal 引用都可以分配给 Pig 的实例。这称为多态性

那么你为什么要这样做呢?如果您编写的代码可以处理任何 Animal,那么您就可以为 Animal 的任何扩展重用该代码,无论 Animal 是否您正在处理的是 pig 山羊大象

这也有助于实现信息隐藏的原则 - 在许多情况下,您要么不需要知道您是否正在处理特定的子类,要么您不想要知道知道。多态性让您可以在更抽象的层面上思考代码设计,而不是必须处理特定的 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);
}

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

oink
baah

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

此代码片段中有第二个多态性示例 - 我将把它作为练习留给您来找出它在哪里:)

关于java - 在Java中,为什么创建新对象时父类有时会在左边?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25901393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com