Java“多态”特性理解

it2022-05-05  199

多态存在的三个必要条件: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();也称为 向上转型

注意:在向上转型下,实例不能调用自身定义的方法,必须通过向下转型才可以调用自身方法。


最新回复(0)