1. 程式人生 > >java中對多型的理解

java中對多型的理解

子類Cat重寫了父類Animal的非靜態成員方法am.eat();的輸出結果為:貓吃飯。
子類重寫了父類(Animal)的靜態成員方法am.sleep();的輸出結果為:動物在睡覺
未被子類(Cat)重寫的父類(Animal)方法am.run()輸出結果為:動物在奔跑
System.out.println(am.num);//輸出結果為10
System.out.println(am.age);//輸出結果為20
那麼我們可以根據以上情況總結出多型成員訪問的特點:
成員變數
編譯看左邊(父類),執行看左邊(父類)
成員方法
編譯看左邊(父類),執行看右邊(子類)。動態繫結
靜態方法
編譯看左邊(父類),執行看左邊(父類)。
(靜態和類相關,算不上重寫,所以,訪問還是左邊的)
只有非靜態的成員方法,編譯看左邊,執行看右邊

---------------------------------------------------華麗的分割線----------------------------------------------------------------------
那麼多型有什麼弊端呢?有的,即多型後不能使用子類特有的屬性和方法。往上面的程式碼看,子類Cat有一個特有的屬性String name = "tomCat"; 並且還有一個特有的抓老鼠的方法catchMouse()。但是在測試類(Demo_Test)中,我們嘗試呼叫子類特有的方法catchMouse()和列印子類特有的成員屬性String name = "tomCat"; 就會報錯。
am
.catchMouse(); System.out.println(am.name);
原因就是多型的弊端,就是:不能使用子類特有的成員屬性和子類特有的成員方法。
--------------------------------------------------華麗的分割線----------------------------------------------------------------------
如果在程式碼執行過程中還想使用Cat類中特有的屬性String name和它特有的成員方法catchMouse()了怎麼辦呢?那我們就可以把這個父類引用指向了子類物件的傢伙am再強制變回Cat型別。這樣am就是Cat型別的引用了,指向的也是Cat物件了,自然也能使用Cat類的一切屬性和一切的成員方法。
class
Demo_Test { public static void main(String[] args) { Animal am = new Cat(); am.eat(); am.sleep(); am.run(); // am.catchMouse(); // System.out.println(am.name); System.out.println(am.num); System.out.println(am.age); System.out.println("------------------------------"); Cat ct = (Cat)am; ct.eat(); ct.sleep(); ct.run(); ct.catchMouse(); } }
<img src="https://pic3.zhimg.com/50/b224f6fa488db52088f02d500677448a_hd.png" _xhe_src="https://pic3.zhimg.com/50/b224f6fa488db52088f02d500677448a_hd.png" data-rawwidth="677" data-rawheight="234" class="origin_image zh-lightbox-thumb" width="677" data-original="https://pic3.zhimg.com/b224f6fa488db52088f02d500677448a_r.png"/>很明顯,執行強轉語句Cat ct = (Cat)am;之後,ct就指向最開始在堆記憶體中建立的那個Cat型別的物件了。這就是多型的魅力吧,雖然它有缺點,但是它確實十分靈活,減少多餘物件的建立,不用說為了使用子類的某個方法又去重新再堆記憶體中開闢一個新的子類物件。以上。。
----------------------------------------------------------分割線------------------------------------------------------------------------
花木蘭替父從軍
大家都知道花木蘭替父從軍的例子,花木蘭替父親花弧從軍。那麼這時候花木蘭是子類,花弧是父類。花弧有自己的成員屬性年齡,姓名,性別。花木蘭也有這些屬性,但是很明顯二者的屬性完全不一樣。花弧有自己的非靜態成員方法‘騎馬殺敵’,同樣花木蘭也遺傳了父親一樣的方法‘騎馬殺敵’。花弧還有一個靜態方法‘自我介紹’,每個人都可以問花弧姓甚名誰。同時花木蘭還有一個自己特有的非靜態成員方法‘塗脂抹粉’。但是,現在花木蘭替父從軍,女扮男裝。這時候相當於父類的引用(花弧這個名字)指向了子類物件(花木蘭這個人),那麼在其他類(其他的人)中訪問子類物件(花木蘭這個人)的成員屬性(姓名,年齡,性別)時,其實看到的都是花木蘭她父親的名字(花弧)、年齡(60歲)、性別(男)。當訪問子類物件(花木蘭這個人)的非靜態成員方法(騎馬打仗)時,其實都是看到花木蘭自己運用十八般武藝在騎馬打仗。當訪問花木蘭的靜態方法時(自我介紹),花木蘭自己都是用她父親的名字資訊在向別人作自我介紹。並且這時候花木蘭不能使用自己特有的成員方法‘塗脂抹粉’。-----多型中的向上轉型
那麼終於一將功成萬骨枯,打仗旗開得勝了,花木蘭告別了戰爭生活。有一天,遇到了自己心愛的男人,這時候愛情的力量將父類物件的引用(花弧這個名字)強制轉換為子類物件本來的引用(花木蘭這個名字),那麼花木蘭又從新成為了她自己,這時候她完全是她自己了。名字是花木蘭,年齡是28,性別是女,打仗依然那樣生猛女漢子,自我介紹則堂堂正正地告訴別人我叫花木蘭。OMG!終於,終於可以使用自己特有的成員方法‘塗脂抹粉’了。從此,花木蘭完全回到了替父從軍前的那個花木蘭了。並且和自己心愛的男人幸福的過完了一生。-----多型中的向下轉型