在面向對象的設計中,多態主要體現在向不同的對象發送同一個信息,不同的對象在接收時會產生不同的行爲(即方法),對像可以用自己的方法去響應共同的信息。( 多態:在同一個時刻,體現出來的不同狀態)
多態性主要體現在兩個方面:方法重載實現的靜態多態性(編譯時多態)
方法重寫實現的動態多態性(又稱動態連編)
編譯時多態:在編譯階段,具體調用那個被重載的方法,編譯器會根據參數的不同來靜態確定調用的方法。
動態聯編:由於子類繼承了父類的所有屬性(除過私有),所以子類對象可以作爲父類對象的使用,程序中凡是使用父類對象的地方,都可以用子類對象來代替,一個對象可以通過子類的實例來調用子類的方法。
多態的前提:1)必須有繼承關係
子類繼承父類,存在一些特點
2)必須有方法重寫
子類繼承父類,方法重寫的目的,舉例:動物吃的方法,每一個具體動物吃的東西不一樣,所有必須要方法覆蓋
3)就是必須有父類的引用指向子類對象 (向上轉型)
父類名 fu = new 子類名() ;
通過父類對象的創建是通過子類在堆內存新建了了一個對象,由於子類又繼承了父類,父類的引用(初始化)是通過子類新建對象進行的..
多態中的成員訪問特點:
1)成員變量: 編譯看左,運行看左...
2)成員方法(非靜態): 編譯看左,運行看右(存在方法重寫)
3)構造方法:構造方法(無論子類,還是父類),都是對對象進行初始化
4)靜態成員方法: 編譯看左,運行看左(靜態跟類有關係,算不上方法重寫)
多態的好處:
可以提供代碼的複用性:繼承保證
可以提高的代碼的擴展性:由多態保證... (父類的引用指向子類對象)
多態的弊端:
父類引用指向子類對象,
通過父類的引用調用子類特有功能,不能調用....
不能訪問子類特有功能
Father3 f = new Son3() ; 父類的引用指向子類對象 (向上轉型)
可不可以將子類的引用指父類的引用呢? (向下轉型)
將父類的引用強制轉換子類的引用
將父類的引用強制轉換子類的引用 ,向下轉型使用不當,會出現一個異常:屬於運行時期異常:ClassCastException
父類對象和子類對象的轉化需要注意如下原則:
一:子類對象可視爲是其父類的一個對象
二:父類對象不能被當做是其某一個子類的對象
三:如果一個方法定義的是父類對象,那麼調用這個方法時,可以使用子類對象作爲實際參數。