一、在介紹多態之前,首先介紹一個重要的知識點——Java引用變數的類型
Java中引用變數有兩個類型:
1、編譯時間類型,由聲明該變數時使用的類型決定;
2、運行時類型,由實際賦給該變數的對象決定;
在編譯時間類型與運行時類型不一致時,就可能出現——多態
二、什麼是多態
多態就是“多種形態“;在程式運行過程中才決定用哪個方法,多態性是允許你將父類對象設定成和它的一個或多個子物件相等的技術,賦值後,父物件就可以根據當前賦值給它的子物件的特性運作,即為多態。
多態是物件導向編程領域的核心概念。(物件導向三大特性:封裝,繼承,多態)
注意:重載方法在編譯期間就確定了,是靜態;方法重載與多態無關,真正與多態相關的是重寫(覆蓋Override);
三、向上轉型
子類是一種特殊的父類,Java中允許把一個子類對象直接賦給一個父類引用變數,無需類型強制轉換,就被稱為向上轉型,這個過程是由系統自動完成的。
四、多態產生的必要條件
1、要有繼承
2、要有重寫(覆蓋Override)
3、子類對象賦給父類引用變數(父類引用指向子類對象)
五、多態代碼執行個體
package com.java.test;class Father {public String name = "father";//父類基本方法public void fatherMethod(){System.out.println("父類的基本方法。");}//被子類覆蓋方法public void overrideMethod(){System.out.println("父類被子類覆蓋方法。");}}public class Child extends Father{public String name = "child";//子類基本方法public void childMethod(){System.out.println("子類基本方法。");}//子類覆蓋父類方法public void overrideMethod(){System.out.println("子類覆蓋父類方法。");}public static void main(String[] args){//下面編譯時間類型與運行時類型相同,不存在多態Father father = new Father();System.out.println(father.name);father.fatherMethod();father.overrideMethod();System.out.println();//下面編譯時間類型與運行時類型相同,不存在多態Child child = new Child();System.out.println(child.name);child.childMethod();child.overrideMethod();System.out.println();//下面編譯時間類型與運行時類型不同,多態發生//父類引用指向子類對象,多態發生條件齊全//father2對象編譯時間類型是FatherClass,運行時類型是ChildClassFather father2 = new Child();//注意:與方法不同,對象的Field不具備多態性,下面輸出的是父類的nameSystem.out.println(father2.name);father2.fatherMethod();//多態發生,此處調用的是子類重寫的方法father2.overrideMethod();}}