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