多態(tài)學(xué)習(xí)心得
作者:Flyingis
這幾天我在重新復(fù)習(xí)Java語言基礎(chǔ),雖然和團(tuán)隊一起,自己個人都進(jìn)行了實際項目的開發(fā),但越往上面走越覺得自己應(yīng)該花點(diǎn)時間看看Java的基礎(chǔ)知識,鞏固一下基礎(chǔ)。今天復(fù)習(xí)的是多態(tài),同時寫下自己的學(xué)習(xí)心得。
數(shù)據(jù)抽象、繼承和多態(tài)是面向?qū)ο蟪绦蛟O(shè)計語言的三大特性。多態(tài),我覺得它的作用就是用來將接口和實現(xiàn)分離開,改善代碼的組織結(jié)構(gòu),增強(qiáng)代碼的可讀性。在某些很簡單的情況下,或許我們不使用多態(tài)也能開發(fā)出滿足我們需要的程序,但大多數(shù)情況,如果沒有多態(tài),就會覺得代碼極其難以維護(hù)。
在Java中,談?wù)摱鄳B(tài)就是在討論方法調(diào)用的綁定,綁定就是將一個方法調(diào)用同一個方法主體關(guān)聯(lián)起來。在C語言中,方法(在C中稱為函數(shù))的綁定是由編譯器來實現(xiàn)的,在英文中稱為early binding(前期綁定),因此,大家自然就會想到相對應(yīng)的late binding(后期綁定),這在Java中通常叫做run-time binding(運(yùn)行時綁定),我個人覺得這樣稱呼更貼切,運(yùn)行時綁定的目的就是在代碼運(yùn)行的時候能夠判斷對象的類型。通過一個簡單的例子說明:
/**
* 定義一個基類
*/
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”);
}
}
/**
* 測試輸出結(jié)果的類
*/
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);
}
}
最后的輸出結(jié)果分別是father和mother,將派生類的引用傳給基類的引用,然后調(diào)用重寫方法,基類的引用之所以能夠找到應(yīng)該調(diào)用那個派生類的方法,就是因為程序在運(yùn)行時進(jìn)行了綁定。
學(xué)過Java基礎(chǔ)的人都能很容易理解上面的代碼和多態(tài)的原理,但是仍有一些關(guān)鍵的地方需要注意的,算是自己對多態(tài)的一個小結(jié):
1. Java中除了static和final方法外,其他所有的方法都是運(yùn)行時綁定的。在我另外一篇文章中說到private方法都被隱式指定為final的,因此final的方法不會在運(yùn)行時綁定。當(dāng)在派生類中重寫基類中static、final、或private方法時,實質(zhì)上是創(chuàng)建了一個新的方法。
2. 在派生類中,對于基類中的private方法,最好采用不同的名字。
3. 包含抽象方法的類叫做抽象類。注意定義里面包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的接口。
4. 對象清理的順序和創(chuàng)建的順序相反,當(dāng)然前提是自己想手動清理對象,因為大家都知道Java垃圾回收器。
5. 在基類的構(gòu)造方法中小心調(diào)用基類中被重寫的方法,這里涉及到對象初始化順序。
6. 構(gòu)造方法是被隱式聲明為static方法。
7. 用繼承表達(dá)行為間的差異,用字段表達(dá)狀態(tài)上的變化。
posted on 2005-10-31 19:28 Flyingis 閱讀(1183) 評論(1) 編輯 收藏 所屬分類: JavaSE