多态:可以理解为事物存在的多重体现形态
函数的多态性
对象的多态性
1 多态的体现
父类的引用指向自己的子类对象(代码体现形式)
换个说法,父类的引用也可以接收自己的子类对象
2 多态的前提
必须是类与类之间有关系,要么继承,要么实现
实现覆盖
3 多态的好处
多态的出现大大的提高了程序的扩展性
4 多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员
5 多态的应用
6 多态的成员函数(非static类型)的特点(多态使用的注意事项)
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,否则就编译失败
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边
6 静态(static)成员函数的特点
无论编译和运行,都参考左边
8 在多态中成员变量的特点:
无论编译和运行,都参考引用变量所属的类(参考左边)
1 abstract class Animal 2 { 3 public abstract void eat(); 4 } 5 6 class Cat extends Animal 7 { 8 public void eat() 9 { 10 System.out.println("吃鱼"); 11 } 12 public void catchMouse() 13 { 14 System.out.println("抓老鼠"); 15 } 16 } 17 18 class Dog extends Animal 19 { 20 public void eat() 21 { 22 System.out.println("吃骨头"); 23 } 24 public void watchHome() 25 { 26 System.out.println("看家"); 27 } 28 } 29 30 31 class PolymorphismDemo 32 { 33 public static void main(String[] args) 34 { 35 Animal c = new Cat();//多态//类型提升,向上转型 36 //c.catchMouse();//invalid 37 //那么如果想要调用猫的特有方法时,如何操作? 38 //强制将父类的引用转成子类类型,向下转型 39 Cat a = (Cat)c; 40 a.catchMouse(); 41 //Animal a = new Animal();Cat c = (Cat)a;//对比上面invalid 42 //千万不要将父类对象转成子类类型 43 //我们能转换的是父类的引用指向了子类对象的时候,该引用可以被提升和强制转换 44 //多态自始自终都是子类对象在做变化 45 //function(new Cat()); 46 //function(new Dog()); 47 48 } 49 public static void function(Animal a) 50 { 51 a.eat(); 52 if(a instanceof Cat) 53 { 54 Cat c = (Cat)a; 55 c.catchMouse; 56 } 57 else if(a instanceof Dog) 58 { 59 Dog d = (Dog)a; 60 d.watchHome(); 61 } 62 } 63 /* 64 public static void function(Cat c) 65 { 66 c.eat(); 67 } 68 public static void function(Dog d) 69 { 70 d.eat(); 71 } 72 */ 73 }
Happy coder
浙公网安备 33010602011771号