1、定义
同一个对象,在程序不同时刻的多种运行状态,父类或者接口的引用指向子类对象。举例:水(气态,液态,固态)文章源自亦枫博客-https://yflad.cn/2006.html
文章源自亦枫博客-https://yflad.cn/2006.html
2、实现多态的前提条件
1. 必须有继承或者实现关系文章源自亦枫博客-https://yflad.cn/2006.html
2. 必须有方法的重写文章源自亦枫博客-https://yflad.cn/2006.html
3. 父类(接口)的 引用指向子类(实现)的对象文章源自亦枫博客-https://yflad.cn/2006.html
文章源自亦枫博客-https://yflad.cn/2006.html
3、多态的好处和弊端:
好处:文章源自亦枫博客-https://yflad.cn/2006.html
多态的存在提高了程序的扩展性和后期可维护性文章源自亦枫博客-https://yflad.cn/2006.html
弊端:文章源自亦枫博客-https://yflad.cn/2006.html
虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。不能预先使用子类中定义的特有功能。文章源自亦枫博客-https://yflad.cn/2006.html
文章源自亦枫博客-https://yflad.cn/2006.html
4、多态中对象调用成员的特点
java在执行的时候分为两个时期:编译期,运行期文章源自亦枫博客-https://yflad.cn/2006.html
父类 子类 = 子类对象文章源自亦枫博客-https://yflad.cn/2006.html
Fu f = new Zi();
A:成员变量:编译期看类型,运行期看类型文章源自亦枫博客-https://yflad.cn/2006.html
编译看左边,运行看左边文章源自亦枫博客-https://yflad.cn/2006.html
B:成员方法:编译期看类型,运行期看对象文章源自亦枫博客-https://yflad.cn/2006.html
编译看左边,运行看右边文章源自亦枫博客-https://yflad.cn/2006.html
C:静态方法:编译期看类型,运行期看类型文章源自亦枫博客-https://yflad.cn/2006.html
编译看左边,运行看左边文章源自亦枫博客-https://yflad.cn/2006.html
文章源自亦枫博客-https://yflad.cn/2006.html
5、多态的思想:
指挥同一批对象做事情。举例:带兵打仗,下课等。
6、多态的一个局限性:
只能够访问父类的成员变量和成员方法,不能访问子类自身对象里面的成员变量和成员方法
如何解决这个局限性,可以使用[code]向下转型[/code]来操作
Son son = (Son) father; son.love = "爱好";
7、案例:
儿子装爹的故事:小明会教数学这门课,他儿子会教人打游戏。今天小明出门给别人培训数学去了,儿子在家打游戏。正好客户上门请小明去授数学课,开出100元。儿子想着把这笔钱挣下来买皮肤。请客人先回去父亲稍后就到。客户走了之后儿子穿上父亲的衣服,带上父亲的帽子,粘上胡子,装爹出发了。来到客户家教“数学”。实际教的是打游戏,说下节课在教数学。
package com.auto.oop; /** *父类 */ public class Father { String name; int age; public void teach(){ System.out.println("教语文"); } }
package com.auto.oop; /** * 小明的儿子 */ public class Son extends Father{ String love; @Override public void teach(){ System.out.println("教打游戏"); } public void play(){ System.out.println("吃鸡"); } }
package com.auto.oop; public class TestSon { public static void main(String[] args) { //向上造型 Father father=new Son();//儿子装爹 father.name="小明"; father.age=44; father.teach();//访问的是父类的方法,但执行的是子类重写后的方法 //向下造型 Son son=(Son) father;//装爹完成之后做回自己 //做回自己的时候可以访问自身的成员变量和成员方法 son.love="游戏"; son.play(); } }
小明儿子装爹上完一节课之后回家了,脱下外套和帽子,拿下胡子,做回自己,拿着挣的100元买装备。
备注:向下造型的时候需要注意转换的类型是否是需要的类型,可能会导致类型转换异常
可以通过[code]instanceof[/code]关键字来避免类型转换异常
instanceof关键字作用:判断当前引用是否属于指定的对象类型