使用超类和接口的类instanciation

时间:2015-07-28 18:14:21

标签: java oop

我最近在学习java,我来自PHP背景。 我坚持一个我不太了解的概念,所以我们有一个名为(Animal)的父类和一个名为(Wolf)的子类,据我所知,当你想创建一个新的时候例如,类的实例(Wolf),这是您编写的代码:

Wolf wolf1 = new Wolf();

但是在书中我发现第二种方式也可以得到相同的结果:

Animal wolf1 = new Wolf();

第二件事是,当你有一个接口(让我们调用它(myInterface))并且类(Wolf)正在实现它时,我找到了第三种实现类的方法(Wolf):

myInterface wolf1 = new Wolf();

问题是: 为什么会这样?为什么要这样做呢?有一个简单的例子可以说清楚为什么你应该使用第二种和第三种方式实现你的课程?

2 个答案:

答案 0 :(得分:3)

这是面向对象编程的好处。如果Animal类和Cat extends AnimalDog extends Animal,那么您可以编写较少重复的代码:

public void beAnnoying(Animal animal) {
    animal.makeSound();
}

至于为什么这样做?在现实生活中,你可以使用" Is-A"继承关系。一条狗" Is-A"动物和一只猫" Is-A"动物也。因此,如果所有的anmials都可以发出声音,那么为什么你不能制作一个通用的方法呢?

编辑:因为我无法在评论中回答,我将在这里回答。如果您想说Wolf wolf = new Wolf();然后稍后将变量分配给狗,该怎么办?你不能这样做(你必须创建另一个变量),但是如果你有Animal Wolf = new Wolf();那么wolf = new Dog();就可以了。我确定还有其他原因我不确定。

答案 1 :(得分:1)

正如其他人所说,你正在描述多态性。它的想法是可以使用一个父类来描述许多不同的子类。你已经有了一个Animal父类和一个Wolf子类。我们还要说你想要创建一个Dog子类。 Dog也是Animal,因此在Animal中可以使用Dog中的任何函数(Java中的方法)或变量(Java中的字段)。所以,如果你的动物类有一种方法,

public void eat()
{
   hunger_counter++;
}

您可以在Dog类中调用该方法而不会出错。

dog.eat();

另一种你可以看到它真正帮助我的方法:想想拥有一系列动物。

Animal[] animals = new Animal[4];

我们希望第一只动物成为狼,而其余动物则是狗。我们可以直接使用我们的Animals []数组,而不是拥有一个Wolf对象数组和另一个Dog对象数组。

animals[0] = new Wolf();
animals[1] = new Dog();
animals[2] = new Dog();
animals[3] = new Dog();

他们是所有类型的动物,但他们也有狼/狗类中添加的字段和方法。