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