深入理解Java的多型
阿新 • • 發佈:2019-01-08
這幾天我在重新複習Java語言基礎,雖然和團隊一起,自己個人都進行了實際專案的開發,但越往上面走越覺得自己應該花點時間看看Java的基礎知識,鞏固一下基礎。今天覆習的是多型,同時寫下自己的學習心得。
資料抽象、繼承和多型是面向物件程式設計語言的三大特性。多型,我覺得它的作用就是用來將介面和實現分離開,改善程式碼的組織結構,增強程式碼的可讀性。在某些很簡單的情況下,或許我們不使用多型也能開發出滿足我們需要的程式,但大多數情況,如果沒有多型,就會覺得程式碼極其難以維護。
學過Java基礎的人都能很容易理解上面的程式碼和多型的原理,但是仍有一些關鍵的地方需要注意的,算是自己對多型的一個小結:
1.Java中除了static和final方法外,其他所有的方法都是執行時繫結的。在我另外一篇文章中說到private方法都被隱式指定為final的,因此final的方法不會在執行時繫結。當在派生類中重寫基類中static、final、或private方法時,實質上是建立了一個新的方法。
2.在派生類中,對於基類中的private方法,最好採用不同的名字。
3.包含抽象方法的類叫做抽象類。注意定義裡面包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的介面。
4.物件清理的順序和建立的順序相反,當然前提是自己想手動清理物件,因為大家都知道Java垃圾回收器。
5.在基類的構造方法中小心呼叫基類中被重寫的方法,這裡涉及到物件初始化順序。
6.構造方法是被隱式宣告為static方法。
7.用繼承表達行為間的差異,用欄位表達狀態上的變化。
資料抽象、繼承和多型是面向物件程式設計語言的三大特性。多型,我覺得它的作用就是用來將介面和實現分離開,改善程式碼的組織結構,增強程式碼的可讀性。在某些很簡單的情況下,或許我們不使用多型也能開發出滿足我們需要的程式,但大多數情況,如果沒有多型,就會覺得程式碼極其難以維護。
在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.用繼承表達行為間的差異,用欄位表達狀態上的變化。