子類可以賦值給超類,稱之為向上轉型,這個是自動的。
超類不可以賦值給子類,這個是向下轉型,需要我們手動實現。
賦值給超類的子類引用在運行期間將表現出不同的特性,這就是多態。
小類型 可轉換為 大類型
大類型 轉小類型需要 強制轉換
對於存在繼承關系的強制類型轉換:
子類轉換為父類屬於向上塑型,可以直接轉換
父類轉換為子類屬於向下塑型,需要強制類型轉換,但是不一定成功。成功的條件是這個父類是經過子類向上塑型轉換來的
即 :Father father=new Son(); Son son=(Son)father;
對於不存在繼承關系的強制類型轉換,一般都是失敗的(如果不寫轉換方法的話)
即:
子類可轉為父類,父類不可以轉為子類(如果不用強制類型轉換)
1. 子類和父類含有相同的成員變量的時候,訪問的是父類的成員變量
2. 子類和父類含有相同的成員方法是,訪問的是子類的成員方法
3. 子類和父類含有相同的靜態函數和靜態方法時,訪問的是父類的。
4. 父類不能訪問子類特有成員和方法(強制類型轉換除外)
也就是說,只有在訪問成員方法的時候,才會表現出多態。
或者說:
對象多態時:
1.成員變量:(不涉及覆蓋)
編譯時: 參考引用變量所屬的類中是否有調用的成員變量, 有, 編譯通過,沒有,編譯失敗。
運行時: 參考引用變量所屬的類中是否有調用的成員變量, 並運行該類所屬中的成員變量。
簡單的說:編譯和運行都參考等號的左邊。
2.成員函數(非靜態):
編譯時:參考引用變量所屬的類中是否有調用的成員變量, 有, 編譯通過, 沒有,編譯失敗:
運行時:參考的是對象所屬的類中是否有調用的函數。
簡單的說:編譯看左邊, 運行看右邊。
3.靜態函數, 變量:
編譯和運行都是參考左邊參數類型!
其實靜態方法不存在多態, 靜態方法是屬於類的,我們說的是對象的多態!靜態方法直接用類名調用就好了,
沒必要創建對象!
靜態的方法只能被靜態的方法所覆蓋!