所谓多态
多态指的是程序中定义的引用变量所指向的具体类型和通过该引用对象调用的方法在编程时并不确定,而是在程序运行期间才确定。这样,不用修改原程序代码,就可以让引用变量绑定到不同的类实现上,从而导致该引用调用的具体方法随之改变。即不修改程序就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态,也叫做动态绑定,分离了做什么和怎么做,也就是说多态将接口和实现分离开来。
具体实例
假设有个动物类Animal,有个eat()方法
class Animal{
void eat(){ }
}
这个Animal就是父类,现在有一些继承它的子类,分别对eat()进行了覆盖
class Dog extends Animal{
void eat(){
System.out.println("Eat bones" );
}
}
class Cat extends Animal{
void eat(){
System.out.println("Eat fish" );
}
}
class Sheep extends Animal{
void eat(){
System.out.println("Eat grass" );
}
}
现在三种小动物都有自己的eat方法了,我想让每种小动物都吃一口东西,可以这样写:
Dog dog = new Dog();
dog.eat();
Cat cat = new Cat();
cat.eat();
Sheep sheep = new Sheep();
sheep.eat();
这时候新加了一种小动物chicken,这时候我们需要再去new一个chicken。虽然也可以,但是每次新加都要新改代码很麻烦,于是我们就可以用到多态,首先我们需要理解什么叫做向上转型,在继承中,我们知道子类是父类的拓展,如果我们定义了一个指向子类的父类引用类型,那么它除了可以引用父类的共性,还可以使用子类强大的功能。当然它不能调用只存在于子类中的属性和方法。
那么现在想要实现dog.eat()我们还可以这样用:
Animal a = new Dog();
a.eat();
于是我们可以这样做:
Animal[] ani = new Animal[3];
ani[0] = new Dog();
ani[1] = new Cat();
ani[2] = new Sheep();
写成for循环就是:
for (int i = 0; i<3;i++){
ani[i].eat();}
运行结果同样是:
Eat bones
Eat fish
Eat grass
网友评论