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