JAVA認(rèn)證:Java中的instanceof關(guān)鍵字

字號:

instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數(shù)據(jù)。舉個例子:
    String s = "I AM an Object!";
    boolean isObject = s instanceof Object;
    我們聲明了一個String對象引用,指向一個String對象,然后用instancof來測試它所指向的對象是否是Object類的一個實例,顯然,這是真的,所以返回true,也就是isObject的值為True. instanceof有一些用處。比如我們寫了一個處理賬單的系統(tǒng),其中有這樣三個類:
    public class Bill {//省略細(xì)節(jié)}
    public class PhoneBill extends Bill {//省略細(xì)節(jié)}
    public class GasBill extends Bill {//省略細(xì)節(jié)}
    在處理程序里有一個方法,接受一個Bill類型的對象,計算金額。假設(shè)兩種賬單計算方法不同,而傳入的Bill對象可能是兩種中的任何一種,所以要用instanceof來判斷:
    public double calculate(Bill bill) {
    if (bill instanceof PhoneBill) {
    //計算電話賬單
    }
    if (bill instanceof GasBill) {
    //計算燃?xì)赓~單
    }
    ...
    }
    這樣就可以用一個方法處理兩種子類。
    然而,這種做法通常被認(rèn)為是沒有好好利用面向?qū)ο笾械亩鄳B(tài)性。其實上面的功能要求用方法重載完全可以實現(xiàn),這是面向?qū)ο笞兂蓱?yīng)有的做法,避免回到結(jié)構(gòu)化編程模式。只要提供兩個名字和返回值都相同,接受參數(shù)類型不同的方法就可以了:
    public double calculate(PhoneBill bill) {
    //計算電話賬單
    }
    public double calculate(GasBill bill) {
    //計算燃?xì)赓~單
    }
    所以,使用instanceof在絕大多數(shù)情況下并不是推薦的做法,應(yīng)當(dāng)好好利用多態(tài)。