多态存在的三个必要条件:1.继承 2.重写 3.父类引用指向子类对象.
为甚么要多态:
首先要知道多态的定义:多态是同一个行为具有多个不同表现形式或形态的能力。也就是同一个接口,使用不同的实例而执行不同操作。
比如下面的代码:
public class duotai {
public static void main(String[] args) {
cat c=new cat();
dog d=new dog();
show_c(c);
show_d(d);
}
/*定义猫类的show函数*/
public static void show_c(cat c) {
c.eat();
c.work();
}
/*定义狗类的show函数*/
public static void show_d(dog d) {
d.eat();
d.work();
}
}
/*定义猫类*/
class cat {
public void eat() {
System.out.println("猫吃鱼");
}
public void work() {
System.out.println("猫抓老鼠");
}
}
/*定义狗类*/
class dog{
public void eat() {
System.out.println("狗啃骨头");
}
public void work() {
System.out.println("狗看家");
}
}
输出:
猫吃鱼
猫抓老鼠
狗啃骨头
狗看家
上面这段代码定义了两个类猫和狗,并且分别实例化对象c和d,并且定义猫类和狗类的show函数。那么问题来了,这两个show可不可以合成一个,如果可以那么代码就更加简化了。
那么这两个show函数合并的关键在于,定义函数时参数列表的不同,一个参数为cat类,一个为dog类,因此要想合并,必须统一参数列表。
因此多态就来了。
多态的解决:
public class duotai {
public static void main(String[] args) {
Animal c= new cat();/*向上转型*/
Animal d= new dog();
show(c);
show(d);
}
/*定义show函数*/
public static void show(Animal a) {
a.eat();
if(a instanceof cat) {
cat c=(cat) a;/*向下转型*/
c.work();
}else {
dog d=(dog) a;
d.work();
}
}
}
/*定义父类Animal*/
abstract class Animal{
abstract void eat();
}
/*定义猫类*/
class cat extends Animal{
public void eat() {
System.out.println("猫吃鱼");
}
public void work() {
System.out.println("猫抓老鼠");
}
}
/*定义狗类*/
class dog extends Animal{
public void eat() {
System.out.println("狗啃骨头");
}
public void work() {
System.out.println("狗看家");
}
}
输出:
猫吃鱼
猫抓老鼠
狗啃骨头
狗看家
上面就是使用多态来重写show函数,代码中多态满足三要素:
1.继承 :猫类和狗类继承自动物抽象类:class cat extends Animal,class dog extends Animal
2.重写 :对eat()抽象函数的重写
3.父类引用指向子类对象:Animal c= new cat(); Animal d= new dog();也称为 向上转型
注意:在向上转型下,实例不能调用自身定义的方法,必须通过向下转型才可以调用自身方法。