1.

          主  題: 請教關(guān)于method override
          作  者: amatuer () Blog
          等  級:
          信 譽(yù) 值: 100
          所屬社區(qū): Java J2SE / 基礎(chǔ)類
          問題點(diǎn)數(shù): 80
          回復(fù)次數(shù): 2
          發(fā)表時間: 2007-2-16 23:50:00


          在調(diào)用SubClass中的addAll()時,結(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)用這個addAll的時候會調(diào)用add 這個時候因?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的對象的一個引用
          實(shí)際上super與this是同一個對象

          2.

          如果經(jīng)常對字符串進(jìn)行各種各樣的修改,或者說,不可預(yù)見的修改,那么使用String來代表字符串的話會引起很大的內(nèi)存開銷。因?yàn)镾tring對象建立之后不能再改變,所以對于每一個不同的字符串,都需要一個String對象來表示。這時,應(yīng)該考慮使用StringBuffer類,它允許修改,而不是每個不同的字符串都要生成一個新的對象。并且,這兩種類的對象轉(zhuǎn)換十分容易。
          instanceof有一些用處。比如我們寫了一個處理賬單的系統(tǒng),其中有這樣三個類:

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

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

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

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

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

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

          所以,使用instanceof在絕大多數(shù)情況下并不是推薦的做法,應(yīng)當(dāng)好好利用多態(tài)。


          posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2.16 Java notes - CSDN 記錄

          Posted on 2007-04-22 20:24 ZelluX 閱讀(269) 評論(0)  編輯  收藏 所屬分類: OOP
          2007-02-16 22:15:50
          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 辽中县| 十堰市| 年辖:市辖区| 南澳县| 南宫市| 常州市| 阜城县| 泾阳县| 灵璧县| 辉县市| 津南区| 大足县| 柳江县| 甘南县| 革吉县| 梅河口市| 盈江县| 二连浩特市| 筠连县| 且末县| 云龙县| 阿坝| 南陵县| 新民市| 龙游县| 湛江市| 电白县| 陇川县| 清涧县| 夏河县| 南木林县| 宁晋县| 甘肃省| 通渭县| 军事| 正宁县| 马尔康县| 綦江县| 西乌珠穆沁旗| 湖口县| 长治县|