一、多态的定义
同一事物,在不同时刻体现出不同状态。
例如:水在不同状态可能是:气态、液态、固态。
二、多态前提和体现
1、有继承关系
2、有方法重写
3、有父类引用指向子类对象
三、编译运行原理
1、编译看左边,父类是否有此方法,没有就报错。
2、运行看右边,运行结果一般是右边子类重写后的结果。
四、案例分析
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package polymorphic; 2 /** 3 * 多态案例1,基础 4 * @author zhongfg 5 * @date 2015-06-16 6 */ 7 interface Car { 8 9 public abstract String getName(); 10 11 public abstract int getPrice(); 12 } 13 14 class Benz implements Car { 15 16 @Override 17 public String getName() { 18 // TODO Auto-generated method stub 19 return "BENZ"; 20 } 21 22 @Override 23 public int getPrice() { 24 // TODO Auto-generated method stub 25 return 300000; 26 } 27 28 } 29 30 class Bmw implements Car { 31 32 @Override 33 public String getName() { 34 // TODO Auto-generated method stub 35 return "BMW"; 36 } 37 38 @Override 39 public int getPrice() { 40 // TODO Auto-generated method stub 41 return 250000; 42 } 43 44 } 45 46 class CarShop { 47 48 public void carInfo(Car car){ 49 System.out.println("品牌:"+car.getName()+",价格:"+car.getPrice()); 50 } 51 } 52 53 public class PolymorphicDemo { 54 public static void main(String[] args) { 55 56 CarShop cs = new CarShop(); 57 //传递的是Benz的对象 58 Car car = new Benz(); 59 cs.carInfo(car); 60 61 //传递的是Bmw的对象 62 car = new Bmw(); 63 cs.carInfo(car); 64 } 65 } 66 67 运行结果: 68 品牌:BENZ,价格:300000 69 品牌:BMW,价格:250000
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package polymorphic; 2 /** 3 * 多态案例2,转型问题 4 * @author zhongfg 5 * @date 2015-06-16 6 */ 7 abstract class Animal { 8 9 public abstract void eat(); 10 } 11 12 class Dog extends Animal { 13 14 public void eat(){ 15 System.out.println("狗吃肉"); 16 } 17 18 public void lookDoor(){ 19 System.out.println("狗看门"); 20 } 21 } 22 23 class Cat extends Animal { 24 25 public void eat() { 26 System.out.println("猫吃鱼"); 27 } 28 29 public void playGram() { 30 System.out.println("猫玩游戏"); 31 } 32 } 33 34 public class PolymorphicTest { 35 36 public static void main(String[] args) { 37 //内存中是狗,向上转型 38 Animal a = new Dog(); 39 a.eat(); 40 //向下转型 41 Dog d = (Dog)a; 42 d.lookDoor(); 43 44 System.out.println("------------------"); 45 46 //内存中是猫,向上转型 47 a = new Cat(); 48 a.eat(); 49 //向下转型 50 Cat c = (Cat)a; 51 c.playGram(); 52 53 //java.lang.ClassCastException,内存中的猫不能转换成狗 54 // Dog d2 = (Dog)a; 55 } 56 } 57 58 运行结果: 59 狗吃肉 60 狗看门 61 ------------------ 62 猫吃鱼 63 猫玩游戏