多態的概述多態是繼封裝、繼承之後,面向對象的第三大特性。現實事物經常會體現出多種形態,如學生,學生是人的一種,則一個具體的同學張三既是學生也是人,即出現兩種形態。 Java作為面向對象的語言,同樣可以描述一個事物的多種形態。如Student類繼承了Person類,一個Student的對象便既是Stu... ...
多態的概述
多態是繼封裝、繼承之後,面向對象的第三大特性。
現實事物經常會體現出多種形態,如學生,學生是人的一種,則一個具體的同學張三既是學生也是人,即出現兩種形態。
Java作為面向對象的語言,同樣可以描述一個事物的多種形態。如Student類繼承了Person類,一個Student的對象便既是Student,又是Person。
Java中多態的代碼體現在一個子類對象(實現類對象)既可以給這個子類(實現類對象)引用變數賦值,又可以給這個子類(實現類對象)的超類(或介面)變數賦值。
如Student類可以為Person類的子類。那麼一個Student對象既可以賦值給一個Student類型的引用,也可以賦值給一個Person類型的引用。
最終多態體現為超類引用變數可以指向子類對象。
多態的前提是必須有子超類關係或者類實現介面關係,否則無法完成多態。
在使用多態後的超類引用變數調用方法時,會調用子類重寫後的方法。
多態的定義與使用
多態的定義格式:就是超類的引用變數指向子類對象。
1 超類類型 變數名 = new 子類類型(); 2 變數名.方法名();
- 普通類多態
1 class Father { 2 public Father(){} 3 } 4 class Son extends Father { 5 public Son(){} 6 } 7 //多態的使用 8 Father f = new Son();
- 抽象類多態
1 abstract class Father { 2 public abstract void method(); 3 } 4 class Son extends Father { 5 public void method(){ 6 System.out.println(“重寫超類抽象方法!”); 7 } 8 } 9 //多態的使用 10 Father f = new Son();
- 介面的多態
1 interface Father { 2 void method(); 3 } 4 class Son implements Father { 5 public void method(){ 6 System.out.println(“重寫介面方法!”); 7 } 8 } 9 //多態的使用 10 Father f = new Son();
註意:
同一個超類的方法會被不同的子類重寫。在調用方法時,調用的為各個子類重寫後的方法。
多態中方法的特點:
- 域:
編譯的時候,參考超類中有沒有這個域,如果有,編譯成功,如果沒有,編譯失敗。
運行的時候,運行的是超類中的域值。
編譯運行全看超類。
- 方法:
編譯的時候,參考超類中有沒有這個方法,如果有,編譯成功,如果沒有,編譯失敗。
編譯看超類,運行的是子類的重寫方法。
多態中的轉型:
Java強制數據類型的語言,參數運算的數據,保證類型的統一性。
1 Father f = new Son();
此時運算的兩個數據類型不同,一個是超類,一個是子類。
這裡出現的是自動類型提升。
- 自動類型提升:
將取值小的,自動提升為取值範圍大的,稱為向上轉型。範圍小的看成是子類,範圍大的看成是超類。
- 向上轉型:
當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。
使用格式:
1 父類類型 變數名 = new 子類類型();
如:
1 Person p = new Student();
- 向下轉型:
一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉為子類引用,這個過程是向下轉型。如果是直接創建父類對象,是無法向下轉型的!
使用格式:
1 子類類型 變數名 = (子類類型) 父類類型的變數;
如:
1 Student stu = (Student) p; //變數p 實際上指向Student對象