【问题标题】:In Java, why is the parent class sometimes on the left when creating a new object?在Java中,为什么创建新对象时父类有时会在左边?
【发布时间】:2014-09-17 22:32:36
【问题描述】:

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

Animal pig0 = new Pig();

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

Pig pig0 = new Pig();

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

Animal pig0 = new Pig();

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

谢谢。

【问题讨论】:

  • 您似乎已经回答了自己的问题:“如果他们想要一个动物对象,为什么不直接这样做?Animal pig0 = new Pig()

标签: java class object inheritance


【解决方案1】:

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

那么你为什么要这样做呢?如果您编写的代码可以处理任何Animal,那么您可以将该代码重用于Animal 的任何扩展,无论您正在处理的Animals 是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);
}

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

oink
baah

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

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

【讨论】:

    【解决方案2】:

    Animal 类型的变量将持有nullAnimal 类型的某些对象的标识或其派生。除非变量被声明为final,否则它可能会被更改以识别不同的Animal(或者如果它之前识别出动物,则更改为null)。

    语句Animal myPet = new Pig(); 创建一个名为myPet 的变量,该变量最初将标识Pig 的新构造实例,但可以更改以标识派生自Animal 的任何其他对象(例如Zebra )。相比之下,如果声明是Pig myPet = new Pig();,那么就不可能将myPet 更改为例如。识别 Pig 或 null 以外的任何内容。

    【讨论】:

      【解决方案3】:

      如果静态类型(“左侧”的类名)是接口,例如 in

      ,则最有用
      List<String> names = new ArrayList<String>();
      

      如果您以后决定改用LinkedList,则只需在代码中编辑一行。这两种列表可以互换使用,但性能不同,其中一种操作速度更快。

      如果你更进一步,你可以将new 移动到所谓的工厂方法中,并从使用该接口的代码中完全隐藏具体类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        相关资源
        最近更新 更多