搜尋此網誌

2011年6月26日 星期日

Java Polymorphism(多型)

Java多型可以藉由實作(Implementation)介面(Interface)來實現,或者是說藉由繼承 (Extends)來實現, 以下先介紹實作(Implementation)介面(Interface)的方式



===========================================
接下來是採取繼承(Extends)的方式


在這裡比較特別的是Human hm=new Man();這行敘述,雖然是以Human的型態宣告,
但是卻以Man class來實體化類別,所以在執行的時候還是以實體化的class為主.
為了更明確的觀察這個現象,我們把eat method改成下列:

private void eat(Man m){
m.eat();
}

在這個形況下會出現compile time error.
因為eat method只接受Man型態的物件,所以宣告為Human型態的物件無法被接受.
因為Human為Man的父類別(Super class)所以可以向下轉型(Cast)為Man型態:
(註,但woman類別無法轉型為man)

tester.eat((Man)hm);

可是如果我們接著把Human hm=new Man();的宣告改為Human hm=new Human();並不會出現compile time error,可是在執行的時候
因為實體化的類別為Human,並非Man,因此會出現runtime classcast exception.

在此我們得到一個結論:
Java在compile time的時候是檢查宣告的類別是否可以在某個方法裡被使用,
但是在執行的時候,會以實際的實體化類別所定義的方法來執行
======================================================
接下來我們討論當Man這個Class繼承了Human同時實作了介面Action,會更明顯的看出多型的威力



eat這個行為,可以從Human的觀點去執行,也可以從吃的這個動作的觀點來執行.



沒有留言:

張貼留言