談談對多態性的理解:
一個事物的多種形態(編譯和運行時狀態不一致性)
實現機制:通過繼承、重寫和向上轉型(Object obj = new 子類())來實現。
1.廣義上的理解
-
子類對象的多態性,方法的重寫;方法的重載;
-
子類對象的多態性:編譯時是父類對象,運行時是不確定的子類對象。(體現不一致性)
-
方法的重寫:繼承父類后方法的重寫,子父類方法不一致。(體現不一致性)
-
方法的重載:方法的多態性(方法名一樣,形參列表不一樣,表現出不同形態,即多態性)(沒有體現出狀態不一致性)
-
2.狹義上的理解
-
Java中多態性主要指:子類對象的多態性
-
格式:
Object obj = new Xx(…); 父類的引用指向子類的對象 4
Object obj = new String(“hell!”);
Person per = new Man(); 聲明是父類,實際new的子類對象
-
3.多態的優點
-
減少了大量的重載的方法的定義;開閉原則( 對擴展開放,對修改關閉<無修改> )
-
方法的主要使用場景
應用于方法的形參()中,形參類型無法確定,寫為父類,而實際調用方法時傳遞的是各種各樣的子類。不需要再寫各種重載的方法,直接寫一個父類即可。(減少了大量的重載的方法的定義)
-舉例:public boolean equals(Object obj)
-
-
多態無處不在(重點理解)
- 例如開發中大量使用的抽象類和接口,其根本不能實例化,只能通過子類對象實例化,(體現為多態性)。如果子類對象不能賦值,抽象類和接口將沒有任何意義。
- 抽象類,接口就是基于多態而存在的,抽象類,接口要子類實例化。
- 即如果沒有多態,抽象類和接口將沒有意義。
4.多態的使用(多態new的對象 與 不用多態new對象)
-
多態new的對象
- 虛擬方法調用。即“編譯看左邊,運行看右邊”。
- 屏蔽了子類特有的屬性和方法,不能調用。
- 一般寫在形參上,因為沒法確定子類是誰
-
不用多態new對象
- 方法里面,正常new對象即可
-
注意:屬性不存在多態性。
5.多態的逆過程
- 向下轉型,使用強轉符()。
- 為了避免出現強轉時的ClassCastException,建議強轉()之前使用instanceOf進行判斷