理解JAVA多態__JAVA
來源:互聯網
上載者:User
理解JAVA多態
作者:mienflying 日期:2006-08-19 本文來自blogjava,我發現作者原Flyingis寫的很好,很到位,就轉過來了,自己就懶的寫了……在此為其表示感謝。
這幾天我在重新複習Java語言基礎,雖然和團隊一起,自己個人都進行了實際項目的開發,但越往上面走越覺得自己應該花點時間看看Java的基礎知識,鞏固一下基礎。今天複習的是多態,同時寫下自己的學習心得。
資料抽象、繼承和多態是物件導向程式設計語言的三大特性。多態,我覺得它的作用就是用來將介面和實現分離開,改善代碼的組織圖,增強代碼的可讀性。在某些很簡單的情況下,或許我們不使用多態也能開發出滿足我們需要的程式,但大多數情況,如果沒有多態,就會覺得代碼極其難以維護。
在Java中,談論多態就是在討論方法調用的綁定,綁定就是將一個方法調用同一個方法主體關聯起來。在C語言中,方法(在C中稱為函數)的綁定是由編譯器來實現的,在英文中稱為early binding(前期綁定),因此,大家自然就會想到相對應的late binding(後期綁定),這在Java中通常叫做run-time binding(運行時綁定),我個人覺得這樣稱呼更貼切,運行時綁定的目的就是在代碼啟動並執行時候能夠判斷對象的類型。通過一個簡單的例子說明:
/**
* 定義一個基類
*/
public Class Parents {
public void print() {
System.out.println(“parents”);
}
}
/**
* 定義兩個衍生類別
*/
public Class Father extends Parents {
public void print() {
System.out.println(“father”);
}
}
public Class Mother extends Parents {
public void print() {
System.out.println(“mother”);
}
}
/**
* 測試輸出結果的類
*/
public Class Test {
public void find(Parents p) {
p.print();
}
public static void main(String[] args) {
Test t = new Test();
Father f = new Father();
Mother m = new Mother();
t.find(f);
t.find(m);
}
}
最後的輸出結果分別是father和mother,將衍生類別的引用傳給基類的引用,然後調用重寫方法,基類的引用之所以能夠找到應該調用那個衍生類別的方法,就是因為程式在運行時進行了綁定。
學過Java基礎的人都能很容易理解上面的代碼和多態的原理,但是仍有一些關鍵的地方需要注意的,算是自己對多態的一個小結:
1. Java中除了static和final方法外,其他所有的方法都是運行時綁定的。在我另外一篇文章中說到private方法都被隱式指定為final的,因此final的方法不會在運行時綁定。當在衍生類別中重寫基類中static、final、或private方法時,實質上是建立了一個新的方法。
2.在衍生類別中,對於基類中的private方法,最好採用不同的名字。
3.包含抽象方法的類叫做抽象類別。注意定義裡麵包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類別。抽象類別在派生中就是作為基類的角色,為不同的子類提供通用的介面。
4.對象清理的順序和建立的順序相反,當然前提是自己想手動清理對象,因為大家都知道Java記憶體回收行程。
5.在基類的構造方法中小心調用基類中被重寫的方法,這裡涉及到對象初始化順序。
6.構造方法是被隱式聲明為static方法。
7.用繼承表達行為間的差異,用欄位表達狀態上的變化。