1.
主 題: 請教關(guān)于method override
作 者: amatuer () Blog
等 級(jí):
信 譽(yù) 值: 100
所屬社區(qū): Java J2SE / 基礎(chǔ)類
問題點(diǎn)數(shù): 80
回復(fù)次數(shù): 2
發(fā)表時(shí)間: 2007-2-16 23:50:00
在調(diào)用SubClass中的addAll()時(shí),結(jié)果輸出為"sub"。SuperClass中的addAll()調(diào)用的是super.addAll(),按我的理解盡管super.add()被重寫,super.addAll()應(yīng)該調(diào)用super.add(),而結(jié)果卻不是這樣。誰給解釋一下?
以下示意性的代碼:
class SuperClass {
public add() {
System.out.println("super");
}
public addAll() {
add();
}
}
class SubClass extends SuperClass {
public add() {//overriding
System.out.println("sub");
}
public addAll() {//overriding
super.addAll();
}
}
interpb(曾曾胡,深怕情多累美人!!!) ( ) 信譽(yù):87 Blog 2007-2-16 23:58:48 得分: 0
public addAll() {//overriding
super.addAll();
}
這樣只是說 調(diào)用父類的addAll 方法
但是父類在調(diào)用這個(gè)addAll的時(shí)候會(huì)調(diào)用add 這個(gè)時(shí)候因?yàn)槎鄳B(tài)所以調(diào)用SubClass的add
Top
interpb(曾曾胡,深怕情多累美人!!!) ( ) 信譽(yù):87 Blog 2007-2-17 0:05:02 得分: 0
public void addAll() {//overriding
super.addAll();
System.out.println(super.getClass());
System.out.println(super.hashCode());
System.out.println(this.hashCode());
}
你可以打印出super的實(shí)際是屬于SubClass的對象的一個(gè)引用
實(shí)際上super與this是同一個(gè)對象
2.
如果經(jīng)常對字符串進(jìn)行各種各樣的修改,或者說,不可預(yù)見的修改,那么使用String來代表字符串的話會(huì)引起很大的內(nèi)存開銷。因?yàn)镾tring對象建立之后不能再改變,所以對于每一個(gè)不同的字符串,都需要一個(gè)String對象來表示。這時(shí),應(yīng)該考慮使用StringBuffer類,它允許修改,而不是每個(gè)不同的字符串都要生成一個(gè)新的對象。并且,這兩種類的對象轉(zhuǎn)換十分容易。
instanceof有一些用處。比如我們寫了一個(gè)處理賬單的系統(tǒng),其中有這樣三個(gè)類:
public class Bill {//省略細(xì)節(jié)}
public class PhoneBill extends Bill {//省略細(xì)節(jié)}
public class GasBill extends Bill {//省略細(xì)節(jié)}
在處理程序里有一個(gè)方法,接受一個(gè)Bill類型的對象,計(jì)算金額。假設(shè)兩種賬單計(jì)算方法不同,而傳入的Bill對象可能是兩種中的任何一種,所以要用instanceof來判斷:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//計(jì)算電話賬單
}
if (bill instanceof GasBill) {
//計(jì)算燃?xì)赓~單
}
...
}
這樣就可以用一個(gè)方法處理兩種子類。
然而,這種做法通常被認(rèn)為是沒有好好利用面向?qū)ο笾械亩鄳B(tài)性。其實(shí)上面的功能要求用方法重載完全可以實(shí)現(xiàn),這是面向?qū)ο笞兂蓱?yīng)有的做法,避免回到結(jié)構(gòu)化編程模式。只要提供兩個(gè)名字和返回值都相同,接受參數(shù)類型不同的方法就可以了:
public double calculate(PhoneBill bill) {
//計(jì)算電話賬單
}
public double calculate(GasBill bill) {
//計(jì)算燃?xì)赓~單
}
所以,使用instanceof在絕大多數(shù)情況下并不是推薦的做法,應(yīng)當(dāng)好好利用多態(tài)。