Posted on 2007-07-04 22:17
HandSoft 閱讀(878)
評論(0) 編輯 收藏 所屬分類:
雜談
instanceof 是Java的一個(gè)二元操作符,和==, > , < 是同一類東西. 由于它是由字母組成的,所以也是Java的保留關(guān)鍵字. 它的作用是測試它左邊的對象是否是它右邊的類的實(shí)例, 返回boolean類型的數(shù)據(jù)。例:
String s = "I an an Object!";
boolean isObject = s instanceOf Object;
我們聲明了一個(gè)String對象引用, 指向一個(gè)String 對象, 然后用instanceof 來測試它所指向的對象是否是Object類的一個(gè)實(shí)例, 顯然, 這是真的, 所以返回true,也就是isObject的值為True.
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ì)算煤氣帳單
}
...
}
這樣就可以用一個(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ì)鈳?br> }
所以, 使用instanceof在絕大多數(shù)情況下并不是推薦的做法, 應(yīng)當(dāng)好好利用多態(tài).