隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(2)

          隨筆分類(lèi)

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          Java中的instanceof關(guān)鍵字 收藏
           instanceof是Java的一個(gè)二元操作符,和==,>,<是同一類(lèi)東東。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類(lèi)的實(shí)例,返回boolean類(lèi)型的數(shù)據(jù)。舉個(gè)例子:

            String s = "I AM an Object!";
            boolean isObject = s instanceof Object;

            我們聲明了一個(gè)String對(duì)象引用,指向一個(gè)String對(duì)象,然后用instancof來(lái)測(cè)試它所指向的對(duì)象是否是Object類(lèi)的一個(gè)實(shí)例,顯然,這是真的,所以返回true,也就是isObject的值為T(mén)rue。
            instanceof有一些用處。比如我們寫(xiě)了一個(gè)處理賬單的系統(tǒng),其中有這樣三個(gè)類(lèi):

            public class Bill {//省略細(xì)節(jié)}
            public class PhoneBill extends Bill {//省略細(xì)節(jié)}
            public class GasBill extends Bill {//省略細(xì)節(jié)}

            在處理程序里有一個(gè)方法,接受一個(gè)Bill類(lèi)型的對(duì)象,計(jì)算金額。假設(shè)兩種賬單計(jì)算方法不同,而傳入的Bill對(duì)象可能是兩種中的任何一種,所以要用instanceof來(lái)判斷:

            public double calculate(Bill bill) {
            if (bill instanceof PhoneBill) {
            //計(jì)算電話賬單
            }
            if (bill instanceof GasBill) {
            //計(jì)算燃?xì)赓~單
            }
            ...
            }
            這樣就可以用一個(gè)方法處理兩種子類(lèi)。

            然而,這種做法通常被認(rèn)為是沒(méi)有好好利用面向?qū)ο笾械亩鄳B(tài)性。其實(shí)上面的功能要求用方法重載完全可以實(shí)現(xiàn),這是面向?qū)ο笞兂蓱?yīng)有的做法,避免回到結(jié)構(gòu)化編程模式。只要提供兩個(gè)名字和返回值都相同,接受參數(shù)類(lèi)型不同的方法就可以了:

            public double calculate(PhoneBill bill) {
            //計(jì)算電話賬單
            }

            public double calculate(GasBill bill) {
            //計(jì)算燃?xì)赓~單
            }

            所以,使用instanceof在絕大多數(shù)情況下并不是推薦的做法,應(yīng)當(dāng)好好利用多態(tài)。
          posted on 2009-05-07 13:14 lanxin1020 閱讀(182) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): j2se
          主站蜘蛛池模板: 武乡县| 梓潼县| 镇雄县| 丹棱县| 芷江| 曲沃县| 通辽市| 七台河市| 阜南县| 宁津县| 尚义县| 平昌县| 奉化市| 永年县| 泸州市| 南阳市| 巴林右旗| 彝良县| 太仓市| 青海省| 长岛县| 永仁县| 泽普县| 图们市| 资兴市| 山丹县| 承德市| 石景山区| 石狮市| 济南市| 商水县| 营山县| 宜良县| 九寨沟县| 梧州市| 开江县| 清流县| 阳原县| 靖西县| 濉溪县| 融水|