Java: 多态
多态:
可以理解为事物存的多种体现形态。
1,多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接受自己的子类对象
2,多态的前提
必须是类与类之间有关系,要么继承,要么实现接口
通常还有一个前提:存在覆盖
3,多态的好处
多态的出现提高了程序的扩展性
4,多态的弊端
只能使用父类的引用访问父类的成员
5,多态的应用
转型:
向上转型:可以把子类对象的引用指向给父类对象
向下转型:可以使用子类的特殊功能,但前提是父类的引用也是该子类的对象,也就是说始终做着变化的是子类对象的引用
1 /* 2 动物:猫,狗 3 4 */ 5 6 abstract class Animal 7 { 8 public abstract void eat(); 9 } 10 11 class Cat extends Animal 12 { 13 public void eat() 14 { 15 System.out.println("吃鱼"); 16 } 17 public void catchMouse() 18 { 19 System.out.println("抓老鼠"); 20 } 21 } 22 23 class Dog extends Animal 24 { 25 public void eat() 26 { 27 System.out.println("啃骨头"); 28 } 29 public void watchDoor() 30 { 31 System.out.println("看家"); 32 } 33 } 34 35 class Pig extends Animal 36 { 37 public void eat() 38 { 39 System.out.println("吃饲料"); 40 } 41 public void gongDi() 42 { 43 System.out.println("拱地"); 44 } 45 } 46 47 class DuoTaiDemo 48 { 49 public static void main(String[] args) 50 { 51 Cat c = new Cat(); 52 //c.eat(); 53 function(c); 54 c.catchMouse(); 55 56 Dog d = new Dog(); 57 //d.eat(); 58 function(d); 59 d.watchDoor(); 60 61 function(new Pig()); 62 63 System.out.println("上面是普通使用,下面是多态"); 64 Animal aCat = new Cat();//类型提升,向上转型 65 function(aCat); 66 Cat bCat = (Cat)aCat;//强制将父类的引用,转成子类类型,向下转型 67 bCat.catchMouse(); 68 69 Animal aDog = new Dog(); 70 function(aDog); 71 Animal aPig = new Pig(); 72 function(aPig); 73 } 74 75 public static void function(Animal a) 76 { 77 a.eat(); 78 } 79 }
多态成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,反之失败;
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边
多态成员变量的特点:
无论编译和运行都参考左边(引用型变量所属的类)
多态静态成员函数的特点:
无论编译和运行都参考左边