多态:一个引用在不同情况下的多种状态,父类的引用指向子类的对象。
下面通过一个实例分析:
package com.itheima; class Animal { void eat() { System.out.println("动物会吃东西"); } } class Cat extends Animal { void eat() { System.out.println("吃鱼"); } void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal { void eat() { System.out.println("啃骨头"); } void guardHouse() { System.out.println("看家"); } } public class DuotaiDemo { public static void main(String[] args) { Animal a1 = new Cat(); a1.eat(); Animal a2 = new Dog(); a2.eat(); } }
1.多态的体现
Animal a1 = newCat();
父类的引用指向了自己的子类对象,即父类的引用也可以接收自己的子类对象。
2.多态的前提
必须是类与类之间有关系,要么继承,要么实现;
存在覆盖。
3.多态的好处
多态的出现大大地提高了程序的扩展性。
4.多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5.多态的出现代码中的特点(多态使用的注意事项)
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有编译通过,如果没有编译失败。
在执行时期:参阅对象所属的类中是否有相应的方法。
总结:
(1) java中多态强调的是在对象上的体现,其实不在对象上也有体现;比如说函数,重载(同一个函数名称在一个类中有多个)、覆盖(同一函数在子类和父类都具有)也是多态性的体现。
(2) 多态自始至终都是子类对象在做着变化,能转换的是父类的引用指向了自己子类对象时,该引用可以被提升,如:Animal a1 = newCat();,Cat()对象的引用向上转型为Animal类型;也可以被强制转换,如:Cat c = (Cat)a1;即将Cat的对象由Animal类型向下转型为Cat类型。
(3) 一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型,如:Animal a1 = new Cat();可以调用eat()方法,不能调用catchMouse()方法,因为在Animal类中没有定义catchMouse()方法。一个引用调用的是哪一个方法,取决于这个引用所指向的对象,如:Animal a1 = new Cat(); a1.eat(); 执行的是"吃鱼"而不是"动物会吃东西"。
成员函数的特点:编译看左边,运行看右边;
成员变量的特点:无论编译和运行,都参考左边(变量只参考引用所属的类);
静态函数的特点:无论编译和运行,都参考左边(静态只参考引用所属)。