多态:某一类事物的多种存在形态
对象多态的前提:
1:类与类(或接口)要有继承(或实现)关系。
2:一定要有方法的重写。
3:一定要有父类或者接口的引用指向子类的对象。
多态的好处
多态的出现大大的提高了程序的扩展性。
多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态中成员的特点:
Fu f = new Zi();
1:成员变量:编译和运行都看Fu。
2:非静态方法:编译看Fu,运行看Zi。
3:静态方法:编译和运行都看Fu。
成员变量:
编译时期:看的引用型变量所属的类中是否有所调用的变量
运行时期:也是看引用型变量所属的类是否有调用的变量
成员变量无论编译还是运行都看引用型变量所属的类,
编译和运行都看等号左边
成员函数:
编译时:要查看引用变量所属的类中是否有所调用的成员。
在运行时:要查看对象所属的类中是否有所调用的成员。如果父子出现同名的方法,会运行子类中的方法,因为方法有覆盖的特性
编译看左边运行看右边
静态函数:
编译时期:看的引用型变量所属的类中是否有所调用的变量
运行时期:也是看引用型变量所属的类是否有调用的变量
编译和运行都看等号左边
多态的例子:
向上转型 Animal a = new Cat(); a.eat(); //a.catchMouse(); 向下转型 Cat c = (Cat)a; c.eat(); c.catchMouse(); //向上转型 Animal a = new Dog(); //向下转型 转换异常 //Cat c = (Cat)a; Dog d = (Dog)a; 超人的例子: person :谈生意(); SuperMan:谈生意();fly(); Person p = new SuperMan();//超人没变身之前就是普通人一个,只能调用Person里的方法 //在运行的时候发现有SuperMan这个子类继承了他,会去看里面是否有和你调用Person里相同的方法 //如果有运行就执行子类重写的方法(成员函数的特性,覆盖) p.谈生意(); SuperMan sm= (SuperMan)p;//内裤外穿,变身超人 sm.谈生意(); sm.fly(); 无论是向上转型还是向下转型,变化的都是子类对象,绝对不能把父类对象强转为子类类型
多态自始至终都是子类对象在做着变化。
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。
总结:
多态的条件 1,父类引用指向子类对象 2,要有继承或实现 3,要有重写
多态的弊端:不能访问子类特有的方法