twi*_*lco 0 java inheritance class object
我在理解Java的继承方面遇到了一些麻烦.我知道这样的事情是可能的,但它的目的是什么?
Animal pig0 = new Pig();
这里发生了什么?如果有人想在这个例子中创建一个新的Pig对象,为什么不这样做呢?
Pig pig0 = new Pig();
或者如果他们想要一个Animal对象,为什么不这样做呢?
Animal pig0 = new Pig();
允许这种事情的目的是什么,以及真正发生了什么?请注意,这些示例假定它Pig是.的子类Animal.
谢谢.
因为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.
这个代码片段中有第二个多态性的例子 - 我将把它作为练习留给你来弄清楚它在哪里:)