1、定义
同一个对象,在程序不同时刻的多种运行状态,父类或者接口的引用指向子类对象。举例:水(气态,液态,固态)
2、实现多态的前提条件
1. 必须有继承或者实现关系
2. 必须有方法的重写
3. 父类(接口)的 引用指向子类(实现)的对象
3、多态的好处和弊端:
好处:
多态的存在提高了程序的扩展性和后期可维护性
弊端:
虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。不能预先使用子类中定义的特有功能。
4、多态中对象调用成员的特点
java在执行的时候分为两个时期:编译期,运行期
父类 子类 = 子类对象Fu f = new Zi();
A:成员变量:编译期看类型,运行期看类型
编译看左边,运行看左边
B:成员方法:编译期看类型,运行期看对象
编译看左边,运行看右边
C:静态方法:编译期看类型,运行期看类型
编译看左边,运行看左边
5、多态的思想:
指挥同一批对象做事情。举例:带兵打仗,下课等。
6、多态的一个局限性:
只能够访问父类的成员变量和成员方法,不能访问子类自身对象里面的成员变量和成员方法
如何解决这个局限性,可以使用向下转型来操作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元买装备。
备注:向下造型的时候需要注意转换的类型是否是需要的类型,可能会导致类型转换异常
可以通过instanceof关键字来避免类型转换异常
instanceof关键字作用:判断当前引用是否属于指定的对象类型