第一點:
那就是
?????????1.如果子類覆蓋了父類的方法,那么子類對象調用該方法時,被該方法修改的類級別變量是子類的變量。
?????????2.如果子類沒有覆蓋父類方法,而直接調用父類的方法,那么被該方法修改的類級別變量是父類的變量。
1則如下例:

































2.則如下例:

































第二點:
那就是對“覆蓋(override)”和“重載(overload)”以及重建的概念的清晰。
先聲明一下:重建就是寫一個新的方法。
如下例:
下面這個叫覆蓋




































下面這個叫重建,不是重載:











































第三點:
那就是通常所說的“繼承后使用多態”、“動態方法調度”、“運行時類型識別”了。先不要被上面的術語搞昏頭哦:-)
可以總結為以下兩條:
1.默認狀態(和強制類型轉換狀態相區別)下,該對象(sub)能且只能調用父類方法和父類變量(調用子類方法時會出現編譯期錯誤)。此種情況下,還有兩種不同的情況:
?????????? ▲被調用方法是被子類覆蓋的方法,這時父類變量不能被該方法修改。【注1】
?????????? ▲被調用方法沒有被子類覆蓋,這時父類變量可以被該方法修改。
看看下面的代碼,注意1~5處。
























































2.強制類型轉換狀態下【注2】,該對象(sub)能且只能調用其子類方法和子類變量(這時被修改的就是子類變量
了)。
??????? 此種情況下,也有兩種不同情況:
????????????????▲調用方法時強制轉換,比如下面的((Sub)sub).plus(int i);
??????????????? ▲調用變量時強制轉化,比如下面的System.out.println(((Sub)sub).i);
??????? 看看下面的代碼,注意6、7處:





















































【注1】這種情況下,把該對象強制轉換為子類對象時,可以發現,如果子類中覆蓋了父類的方法,那么子類的變量
被改變了。如下例中。
【注2】對父類強制轉換的結果和默認狀態下是相同的,所以,這里只討論對子類強制轉換。
?????? 下面的兩個例子混合了上述情況,體驗一下,注意8~17處。
例1.






















































例2.
























































