多态:一个事物有多种描述(如一个人(A)的爸爸是B爷爷是C,那我们描述A的话,可以通过直接描述A,也可以描述B的儿子,也可以描述C的孙子)
代码体现:父类或接口的引用指向子类对象
1 class 动物 2 { 3 ... ... 4 } 5 class 猫 extends 动物 6 { 7 ... ... 8 } 9 class 狗 extends 动物 10 { 11 ... ... 12 } 13 14 动物 X=new 猫();
多态的应用:
1 abstract class Animal 2 { 3 abstract void eat(); 4 } 5 6 class Cat extends Animal 7 { 8 void eat() 9 { 10 System.out.println("猫吃鱼"); 11 } 12 void catchMouse() 13 { 14 System.out.println("猫抓老鼠"); 15 } 16 } 17 18 class Dog extends Animal 19 { 20 void eat() 21 { 22 System.out.println("狗啃骨头"); 23 } 24 25 void lookHome() 26 { 27 System.out.println("狗看家"); 28 } 29 } 30 31 class DuoTaiDemo 32 { 33 public static void main(String[] args) 34 { 35 Cat c=new Cat(); 36 Dog d=new Dog(); 37 method(c); 38 method(d); 39 } 40 41 void method(Cat c) 42 { 43 c.eat(); 44 } 45 void method(Dog d) 46 { 47 d.eat(); 48 } 50 }
发现:
1、void method(Cat c)代码几乎一样
2、如果以后需求要增加动物(如:猪)是不是还要再写一个关于猪的method方法呢
通过多态修改代码:
1 //增加猪 2 class Pig extends Animal 3 { 4 void eat() 5 { 6 System.out.println("猪吃饲料"); 7 } 8 void gongDi() 9 { 10 System.out.println("猪拱地"); 11 } 12 } 13 14 class DuoTaiDemo 15 { 16 public static void main(String[] args) 17 { 18 Cat c=new Cat(); 19 Dog d=new Dog(); 20 method(c); 21 method(d); 22 //提高代码的扩展性 23 method(new Pig()); 24 } 25 26 /*28 void method(Cat c) 29 { 30 c.eat(); 31 } 32 void method(Dog d) 33 { 34 d.eat(); 35 } 36 */ 37 void method(Animal a) 38 { 39 a.eat(); 40 } 41 }
多态的好处:
1、简化代码
2、提高代码的扩展性
这样的代码有好处就有弊端如果想使用Cat类的catchMouse方法的话
代码如下
1 class DuoTaiDemo 2 { 3 public static void main(String[] args) 4 { 5 Animal a=new Cat(); 6 a.eat(); 7 //a.catchMouse();//这个就是弊端,Animal中不具备catchMouse 8 /* 9 instanceof作用:判断对象类型 10 方式: 11 变量 instanceof 类或接口 12 使用前提:强制转换 13 */ 14 if(a instanceof Cat) 15 { 16 ((Cat)a).catchMouse(); 17 } 18 } 19 }
总结:
一、多态的好处:
简化代码
提高代码的扩展性
二、多态的弊端:
无法使用子类特有内容
三、多态的前提:
必须有关系(继承、实现)