標籤:java 多態
多態:一個對象對應著不同類型
多態在代碼中的體現:父類或介面的引用指向其子類對象。
多態的好處:
提高了代碼的擴充性,前期定義的代碼可以使用後期的內容。
多態的弊端:
前期定義的內容不能使用後期子類中定義的特有內容。
多態的前提:
1,必須有關係,(繼承,實現)。
2,要有覆蓋。
Animal a =new Cat();
自動型別提升,貓對象提升了動物類型。但是特有功能無法訪問。可以限制對特有功能的訪問。專業講:向上轉型。將子類型隱藏,就不能使用子類的特有方法。
如果還想用具體動物貓的特有功能,可以將該對象進行向下轉型。目的是為了使用子類中的特有方法。
Cat c = (Cat) a;
注意:對於轉型,自始至終都是子類對象在做著類型的變化。
if (a instanceof Cat){Cat c=(Cat) a;}
instanceof:用於判斷對象的具體類型(類或是介面),只能用於引用資料類型判斷。
通常在向下轉型前用於健壯性的判斷。
多態時,成員的特點:
1,成員變數
編譯時間:參考引用型變數所述的類中是否有調用的成員變數,有,編譯通過,沒有編譯失敗。
運行時:參考引用型變數所述的類中是否有調用的成員變數,並運行該所屬類中的成員變數。
簡單說:編譯和運行都參考等號左邊。
2,成員函數(重點)非靜態
編譯時間:參考引用型變數所述的類中是否有調用的成員函數,有,編譯通過,沒有編譯失敗。
運行時:參考的是對象所述的類中是否有調用的函數。動態綁定
簡單說:編譯看左邊,運行看右邊。
例子:
class Outer {void method(){Object obj =new Object(){public void show(){System.out.println("show run");}};obj.show();//錯誤提示,找不到符號//因為匿名內部類這個子類對象被向上轉型成了Object類型。這樣就不能再使用子類的特有方法了}}class InnerClass{public static void main(String [] args){new Outer().method();}}
3,靜態函數
編譯時間:參考引用型變數所述的類中是否有調用的靜態方法,有,編譯通過,沒有編譯失敗。
運行時:參考引用型變數所述的類中是否有調用的靜態方法。
簡單說:編譯和運行都看左邊。
其實對於靜態方法,是不需要對象的,直接用類名調用即可。
java語言中的多態概述