1. 程式人生 > >Java中的靜態繫結與動態繫結事例

Java中的靜態繫結與動態繫結事例

在這個例子中使用Java面向物件中的多型來簡單介紹靜態繫結和動態繫結的區別。

/*
* 建立一個Father類。
* 為了方便獲取,成員變數a設定為public的。
* */
class Father{
    public int a = 10;
    public void saying(){
        System.out.println("Father");
    }
}

寫一個父類Father,其中定義一個整型成員變數a並初始化為10;定義一個成員方法saying,輸出為”Father“。

 

/*
* 建立一個Son類,並繼承Father類。
* */
class Son extends Father{
    public int a = 15;
    public void saying(){
        System.out.println("Son");
    }
}

在Son類中定義了與Father中同樣名稱的成員變數和成員方法,但是所含的內容不同。

 

/*
* 測試程式。
* 例項化一個Son物件,並指向其父類Father的引用person。
* 然後用person分別列印和執行成員變數和成員方法的值。
* */
public class Testone {
    public static void main(String[] args) {
        Father person = new Son();
        System.out.println(person.a);
        person.saying();
    }
}
/*
* output:
* 10
* Son
* */

可以看到,person.a的值是10而person.saying()的輸出為Son。顯然person並沒有因為被指向一個Son的例項而改變其成員變數的值,這是因為person本身是一個Father類的引用,而成員變數是靜態繫結的,所以a仍然是Father類的a。而在多型的特性裡,成員方法是動態繫結的,所以你可以看到在這裡因為Father類的引用person指向了Son類的例項導致person.saying()輸出的是”Son“而不是”Father“。

那麼如何使person.a的值變為Son類a的值呢?

我們可以先將person強制轉化為Son。

System.out.println(((Son)person).a);

這樣輸出的a值就是Son類中的a值了。