1.

          主  題: 請教關(guān)于method override
          作  者: amatuer () Blog
          等  級:
          信 譽 值: 100
          所屬社區(qū): Java J2SE / 基礎(chǔ)類
          問題點數(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(曾曾胡,深怕情多累美人!!!) ( ) 信譽:87 Blog 2007-2-16 23:58:48 得分: 0


          public addAll() {//overriding
          super.addAll();
          }


          這樣只是說 調(diào)用父類的addAll 方法

          但是父類在調(diào)用這個addAll的時候會調(diào)用add 這個時候因為多態(tài)所以調(diào)用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.

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

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

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

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

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

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

          public double calculate(GasBill bill) {
          //計算燃氣賬單
          }

          所以,使用instanceof在絕大多數(shù)情況下并不是推薦的做法,應(yī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 閱讀(271) 評論(0)  編輯  收藏 所屬分類: OOP
          2007-02-16 22:15:50
          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 肇州县| 汤阴县| 河津市| 寻乌县| 武隆县| 尉氏县| 二手房| 永安市| 泗水县| 亚东县| 九台市| 修水县| 罗山县| 合阳县| 安新县| 海伦市| 武汉市| 朝阳县| 大同市| 班玛县| 安国市| 昭觉县| 醴陵市| 松阳县| 正镶白旗| 志丹县| 清丰县| 定州市| 黄石市| 尖扎县| 东宁县| 江北区| 黄骅市| 浦北县| 灌南县| 玉树县| 娱乐| 陈巴尔虎旗| 渝中区| 汉沽区| 石楼县|