1.

          主  題: 請教關于method override
          作  者: amatuer () Blog
          等  級:
          信 譽 值: 100
          所屬社區: Java J2SE / 基礎類
          問題點數: 80
          回復次數: 2
          發表時間: 2007-2-16 23:50:00


          在調用SubClass中的addAll()時,結果輸出為"sub"。SuperClass中的addAll()調用的是super.addAll(),按我的理解盡管super.add()被重寫,super.addAll()應該調用super.add(),而結果卻不是這樣。誰給解釋一下?
          以下示意性的代碼:
          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();
          }


          這樣只是說 調用父類的addAll 方法

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

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

          public class Bill {//省略細節}
          public class PhoneBill extends Bill {//省略細節}
          public class GasBill extends Bill {//省略細節}

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

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

          然而,這種做法通常被認為是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象變成應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了:

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

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

          所以,使用instanceof在絕大多數情況下并不是推薦的做法,應當好好利用多態。


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

          2.16 Java notes - CSDN 記錄

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


          網站導航:
           
          主站蜘蛛池模板: 宜君县| 丰都县| 金寨县| 乃东县| 黄冈市| 聂荣县| 南涧| 敖汉旗| 磴口县| 布尔津县| 梁山县| 定远县| 玉环县| 台州市| 西藏| 沈丘县| 阜阳市| 习水县| 莱西市| 宜兰县| 确山县| 祁连县| 汨罗市| 墨江| 上饶县| 丹凤县| 陈巴尔虎旗| 德庆县| 博湖县| 仙居县| 诸暨市| 浠水县| 盈江县| 新竹市| 任丘市| 廊坊市| 金塔县| 扎赉特旗| 五原县| 新营市| 仁寿县|