多態的實現機制是什麼?


多態是面向對象程序設計中代碼重用的一個重要機制,它表示當同一個操作在不同對象時,會有不同的語義,從而會產生不同的結果,例如:同樣是執行“+”操作,“3+4”用來實現正數相加,而“3”+“4”卻實現了字符串的連接。在java語言中,多態主要有以下兩種表現方式:
1)方法的重載。重載是指同一個類中有多個同名的方法,但這些方法有着不同的參數,因此在編譯時就可以確定到底調用哪個方法,它是一種編譯時多態。重載可以被看作一個類中的方法多態性。
2)方法的覆蓋。子類可以覆蓋父類的方法,因此同樣的方法會在父類與子類中有着不同的表現形式。在java語言中,基類的引用變量不僅可以指向基類的實例對象,也可以指向其子類的實例對象。同樣,接口的引用變量也可以指向其實現的實例對象。而程序調用的運行方法在運行期間才動態綁定(綁定指的是將一個方法調用和一個方法主體連接到一起),就是引用變量所指向的具體實例對象的方法。通過這種動態綁定的方法實現了多態。由於只有在運行時才能確定調用哪個方法,因此通過方法覆蓋實現的多態也可以被稱爲運行時多態,示範如下:

方法覆蓋

class Base{
    public Base(){
        g();
    }
    public void f(){
        System.out.println("Base f()");
    }
    public void g(){
        System.out.println("Base g()");
    }

}
class Derived extends Base{
    public void f(){
        System.out.println("Derived f()");
    }
    public void g(){
        System.out.println("Derived g()");
    }
}
public class Test {
    public static void main(String[] args) {
        Base b=new Derived();
        b.f();
        b.g();
    }
}

程序運行結果爲:

Derived g()
Derived f()
Derived g()

上例中,由於子類Derived的f()方法和g()方法與父類Base的方法同名,因此Derivered的方法覆蓋Base的方法。在執行Base b=new Deriver()語句時,會調用Base類的構造函數,而在Base的構造函數中,執行了g()方法,由於Java語言的多態特性,此時會調用子類Derived的g()方法,而非父類Base的g()方法,因此會輸出Deriver g()。由於實際上創建的是Deriver類的對象,後面的方法調用都會調用子類的Deriver的方法。
此外,只有類中的方法纔有多態的概念,類中成員變量沒有多態的概念,示例如下:

class Base1{
    public int i=1;
}
class Deriver1 extends Base1{
    public int i=2;
        }
public class Test1 {
    public static void main(String[] args) {
        Base1 b = new Deriver1();
        System.out.println(b.i);
    }
}

我們的運行結果是

1

由此可見,成員變量是無法實現多態的,成員變量的值取父類還是子類並不取決於創建對象的類型,而是取決於所定義變量的類型,這是在編譯期間確定的。
在上述例子中,由於b所屬的類型是Base,b.i指的是Base類中定義的i;因此程序輸出結果爲1.

常見筆試題

java中提供了哪兩種用於多態的機制?
答案:編譯時多態和運行時多態。編譯時多態是通過方法重載實現的,運行時多態是通過方法的覆蓋(子類覆蓋父類方法)實現的。

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