Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用超类和接口的类实例化_Java_Oop - Fatal编程技术网

Java 使用超类和接口的类实例化

Java 使用超类和接口的类实例化,java,oop,Java,Oop,我最近在学习java,我来自PHP背景。 我被一个我不太理解的概念所困扰,所以我们有一个父类(Animal)和一个子类(Wolf),据我所知,当你想创建一个新的类实例(Wolf)时,例如,你写的代码如下: Wolf wolf1 = new Wolf(); 但在书中,我发现第二种方法也能得到同样的结果: Animal wolf1 = new Wolf(); 第二件事是,当您有一个接口(我们称之为(myInterface))并且类(Wolf)正在实现它时,我发现了第三种实例化类(Wolf)的方法

我最近在学习java,我来自PHP背景。 我被一个我不太理解的概念所困扰,所以我们有一个父类(Animal)和一个子类(Wolf),据我所知,当你想创建一个新的类实例(Wolf)时,例如,你写的代码如下:

Wolf wolf1 = new Wolf();
但在书中,我发现第二种方法也能得到同样的结果:

Animal wolf1 = new Wolf();
第二件事是,当您有一个接口(我们称之为(myInterface))并且类(Wolf)正在实现它时,我发现了第三种实例化类(Wolf)的方法:

问题是:
为什么会这样?为什么一开始就这么做?有没有一个简单的例子可以说明为什么应该使用第二种和第三种方法实例化类?

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

public void beAnnoying(Animal animal) {
    animal.makeSound();
}
至于为什么会这样?在现实生活中,您可以使用“是-是”关系进行继承。狗是动物,猫也是动物。所以,如果所有的anmials都能发出声音,那么为什么不能创建一个通用调用它的方法呢


编辑:因为我不能在评论中回答,所以我会在这里回答。如果你想说,
Wolf-Wolf=new-Wolf()然后将变量分配给狗?你不能使用这个(你必须创建另一个变量),但是如果你有
Animal-Wolf=new-Wolf()然后做了
wolf=newdog()这很好用。我肯定还有其他我不确定的原因。

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

public void beAnnoying(Animal animal) {
    animal.makeSound();
}
至于为什么会这样?在现实生活中,您可以使用“是-是”关系进行继承。狗是动物,猫也是动物。所以,如果所有的anmials都能发出声音,那么为什么不能创建一个通用调用它的方法呢


编辑:因为我不能在评论中回答,所以我会在这里回答。如果你想说,
Wolf-Wolf=new-Wolf()然后将变量分配给狗?你不能使用这个(你必须创建另一个变量),但是如果你有
Animal-Wolf=new-Wolf()然后做了
wolf=newdog()这很好用。我肯定还有其他我不确定的原因。

正如其他人所说,你在描述多态性。一个父类可以用来描述许多不同的子类。您已经有了一个Animal父类和一个Wolf子类。让我们也假设你想做一个狗的子类。狗也是动物,所以在动物身上找到的任何函数(Java中的方法)或变量(Java中的字段)都可以在狗身上使用。所以如果你在动物课上有吃的方法

public void eat()
{
   hunger_counter++;
}
您可以在Dog类中调用该方法而不会出错

dog.eat();
你可以从另一个角度来看待它,它确实帮助了我:想想有一系列的动物

Animal[] animals = new Animal[4];
我们希望第一只动物是狼,其余的是狗。我们可以直接使用Animals[]数组,而不是一个狼对象数组和另一个狗对象数组

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

它们都是Animal类型,但它们也会在Wolf/Dog类中添加字段和方法。

正如其他人所说,您描述的是多态性。一个父类可以用来描述许多不同的子类。您已经有了一个Animal父类和一个Wolf子类。让我们也假设你想做一个狗的子类。狗也是动物,所以在动物身上找到的任何函数(Java中的方法)或变量(Java中的字段)都可以在狗身上使用。所以如果你在动物课上有吃的方法

public void eat()
{
   hunger_counter++;
}
您可以在Dog类中调用该方法而不会出错

dog.eat();
你可以从另一个角度来看待它,它确实帮助了我:想想有一系列的动物

Animal[] animals = new Animal[4];
我们希望第一只动物是狼,其余的是狗。我们可以直接使用Animals[]数组,而不是一个狼对象数组和另一个狗对象数组

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

它们都是Animal类型,但它们也会在Wolf/Dog类中添加字段和方法。

Wolf
的可能副本是
Animal
(作为
Animal
的子类),这就是第一个类工作的原因。第二个类似,当
Wolf
实现和接口时,
Wolf
也成为接口
myInterface
Wolf
的可能副本是
Animal
(作为
Animal
的子类),这就是第一个的工作原理。第二个类似,当
Wolf
实现和接口时,
Wolf
也成为该接口
myInterface
。从您给出的示例中,我可以清楚地理解为什么给(动物)提供(动物)的数据类型,因此可以使用多态性传递从(动物)类派生的所有对象。但是,当您只是想实例化类(Wolf)时,为什么还要麻烦使用(Animal)和(myInterface)符号呢?这就是我无法理解的。当你不需要多态性时,就不要使用它:)从你给出的示例中,我可以清楚地理解为什么你给(动物)提供(动物)的数据类型,所以你可以使用多态性传递从(动物)类派生的所有对象。但是,当您只是想实例化类(Wolf)时,为什么还要麻烦使用(Animal)和(myInterface)符号呢?这就是我无法理解的。当你不需要多态性时,就不要使用它:)