概念:对于同一个指令(调用同一个名称的方法),不同的方法给予不同的反应(不同的方法实现)
例如:老师给学生上课,当老师说下课时,不同的学生有不同的反应,有的学生上厕所、有的学生喝水,但老师下发的指令只有一个
这就是多态,同一指令,不同的事物有不同的反应
规范(多态实现的前提):
1.必须要有继承关系
2.子类方法必须重写父类方法
3.父类引用指向子类对象(同一引用类型,使用不同的实例而执行不同的操作)
1 public class DuoTai { 2 public static void main(String[] args) { 3 //父类引用指向子类对象 4 Father father = new Child(); 5 /** 6 * 由于fun1在子类中没有方法重写,当调用fun1时只会调用父类中的fun1 7 * 子类中重写了fun2,当执行到父类中fun1中的fun2时,就会执行子类中重写的fun2 8 */ 9 father.fun1();//执行结果为子类中的fun2 10 } 11 } 12 13 class Father{ 14 public void fun1(){ 15 fun2(); 16 } 17 18 public void fun2(){ 19 System.out.println("父类中的fun2"); 20 } 21 } 22 23 class Child extends Father{ 24 //方法重载 25 public void fun1(int i){ 26 System.out.println("子类中的fun1"); 27 } 28 //方法重写 29 public void fun2(){ 30 System.out.println("子类中的fun2"); 31 } 32 }
如上代码可以体现出
当子类中没有重写父类中现有的方法时,多态调用的是父类中的方法
当子类中重写了父类中的方法时,多态调用的是子类中的方法
多态的目的:
为了提高代码的扩展性和维护性
方便代码逻辑的编写
多态的两种表现形式:
1.父类作为方法的参数
2.父类作为方法的返回值类型
引用类型的转换与基本类型的转换类似:
父类转成子类时要进行强制转换,但在强制转化前一定要先判断父类引用指向的子类对象到底是谁,若无法确定,在运行过程中可能出错
子类转成父类时,直接自动转换,不需要进行任何的判断