Java中的靜態繫結與動態繫結事例
阿新 • • 發佈:2018-12-01
在這個例子中使用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值了。