2011年3月23日 星期三

漫談物件導向(十一) - 多型性

多型性polymorphism

維基百科對多型(英語Polymorphism)一詞的解釋是「物件導向程式執行時,相同的訊息可能會送給多個不同的類別之物件,而系統可依據物件所屬類別,引發對應類別的方法,而有不同的行為」。參照下列程式碼,比較能清楚說明多型的機制。

1.        class OOTest {
2.          public static void main(String[] args) {
3.            SHAPE sobj = null;
4.            CIRCLE c1 = new CIRCLE(3.0F);
5.            RECTANGLE r1 = new RECTANGLE(3.0F, 4.5F);
6.            sobj = c1;
7.            sobj.showinfo();
8.            System.out.println ("area = " + sobj.area() );
9.            sobj = r1;
10.            sobj.showinfo();
11.            System.out.println ("area = " + sobj.area() );
12.          }
13.        }

程式碼第3行宣告了一個SHAPE型別變數,但由於SHAPE是個抽象類別,不能建構物件實體,所以sobj物件變數參照初始值設定為null

在物件導向機制中,父類別型別的物件變數允許參照到其子類別的物件實體,在程式碼第6行,sobj參照到CIRCLE類型物件實體c1,所以程式碼第7sobj.showinfo()表示叫用CIRCLE類別之showinfo()方法,程式碼第8sobj.area()表示叫用CIRCLE類別之area()方法。

而當程式碼第9行將sobj參照到RECTANGLE類型物件實體r1之後,程式碼第10sobj.showinfo()表示叫用RECTANGLE類別之showinfo()方法,程式碼第11sobj.area()表示叫用RECTANGLE類別之area()方法。

換言之,JVM在叫用方法時會依據參照變數實際所參照的物件實體,動態連結到正確的物件方法,這種機制稱為多型性 (polymorphism)

This is a circle
area = 28.26
This is a rectangle
area = 13.5