Java 多態 後鏈接(late binding)與前鏈接(early binding) 向上轉型(upcast)

使用過面向對象編程(OPP)的都知道,多態是OPP的一個主要特性之一。Java做爲一種OPP語言,其也有多態特性。
那麼什麼是多態呢?

多態

指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行爲方式。(發送消息就是函數調用)
先舉個例子,我們定義Shape類,Square和Circle繼承Shape類,並重載其draw方法。

public class Shape {
    public void draw() {
        System.out.println("draw in Shape!");
    }
}

class Square extends Shape {
    public void draw() {
        System.out.println("draw in Square!");
    }
}

class Circle extends Shape {
    public void draw() {
        System.out.println("drwa in Circle!");
    }
}

測試代碼如下,

    public static void main(String[] args) {
        Shape square = new Square();
        square.draw();
        Shape circle = new Circle();
        circle.draw();
    }

測試結果爲,

draw in Square!
drwa in Circle!

以上代碼就涉及到多態現象。當我們調用draw方法時,Java會根據運行時對象的類型來判斷調用誰的方法。比如square在運行時是Square類型,就會調用其draw方法;circle也類似。
或許你會疑問,square的類型命名是Shape,爲什麼能賦值爲Square類型的呢。這就是向上轉型了。

向上轉型(upcast)

繼承最重要的不是給子類提供了方法,而是父類與子類的關係。該關係可以概括爲子類是父類的一種(The new class is a type of the existing class)。
由於繼承意味着,父類的方法,在子類中也存在,所以向父類發送的消息(父類的方法調用),也可以發送給子類。
這樣我們可以理解,Shape square = new Square();該語句爲什麼可以通過編譯。
另外,向上轉型是安全的,這是由於,向上轉型是由特定的類轉爲一般的類。也就是,子類是父類的超級(superset),子類包含所有父類的方法。

後鏈接(late binding)

上面提到Java會根據運行時對象的類型來判斷調用的方法,這就是後鏈接。與鏈接接相對的是,前鏈接。
將方法與方法的對象聯繫起來叫鏈接。在程序執行前完成鏈接的(由編譯器或鏈接器完成),叫前鏈接,C語言就是一個例子。
然而,Java中,由於多態,在編譯的時候,編譯器僅僅知道一個引用,無法知道調用哪個方法。後鏈接解決了該問題,在運行時根據對象的類型來鏈接方法。後鏈接也稱爲動態鏈接(dynamic binding)、運行時鏈接(run-time binding)。
Java中,所有的方法都是後鏈接,除非,該方法聲明爲final方法。很容易理解,因爲final方法無法被重寫,所以編譯器可以知道該方法屬於哪個類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章