飛翔的起點

          從這里出發(fā)

          導(dǎo)航

          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統(tǒng)計

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          java重載的解析

              從昨晚開始在看java疑惑這本書,打算以后每天把看的東西以這種方式寫下了
          來,一方面使所學(xué)的東西得到鞏固和復(fù)習(xí),另一方面和大家共同進步.
              1. 在java中重載解析的過程是分兩個階段運行的,第一階段選取所有可獲得并且可以應(yīng)用的方法或構(gòu)造器,第二階段在第一階段選取的方法或構(gòu)造器中選取最精確的一個.,如果一個方法或構(gòu)造器可以接受傳遞給另一個方法或構(gòu)造器的任何參數(shù),那么說明第一個方法幣第二個方法缺乏精確性,
              2.在設(shè)計一個類的時候,如果該類構(gòu)建于另一個累的行為之上,那么你有兩種選擇,一種是集成,即一個累擴展另一個累;另一個是組合,即在一個類中包含另一個類的實例.
                 選擇的依據(jù)是:
                 一個類的每一個實例都是另一個類的一個實例,還是都有另一個類的一個實例.在前一種情況下就使用集成,而在后一種情況下應(yīng)該使用組合.當(dāng)你不準(zhǔn)時,優(yōu)先選擇組合而不是繼承.
              3.靜態(tài)方法
              靜態(tài)方法在繼承中只能被隱藏而不可以重寫,靜態(tài)方法只能訪問靜態(tài)變量,它的參數(shù)和它定義的局部變量,訪問靜態(tài)方法盡可能的使用類名來訪問.
             今天就寫到這,有問題的地方可以指正,謝謝大家.

          posted on 2007-12-13 13:18 forgood 閱讀(3103) 評論(3)  編輯  收藏

          評論

          # re: java重載的解析 2007-12-13 13:44 cc

          是java解惑吧,java疑惑,難道越看越疑惑啊。  回復(fù)  更多評論   

          # re: java重載的解析 2007-12-18 18:54 forgood

          是呀,我也感覺如此,但是細細看的話,會發(fā)現(xiàn)好多經(jīng)常遇到的問題,仔細的看看,可以鞏固\復(fù)習(xí)一些知識,
          共同進步,
            回復(fù)  更多評論   

          # re: java重載的解析[未登錄] 2007-12-19 09:22 ddpie

          謎題46:令人混淆的構(gòu)造器案例
          本謎題呈現(xiàn)給你了兩個容易令人混淆的構(gòu)造器。main方法調(diào)用了一個構(gòu)造器,但是它調(diào)用的到底是哪一個呢?該程序的輸出取決于這個問題的答案。那么它到底會打印出什么呢?甚至它是否是合法的呢?
          public class Confusing {
          private Confusing(Object o) {
          System.out.println("Object");
          }
          private Confusing(double[] dArray) {
          System.out.println("double array");
          }
          public static void main(String[] args) {
          new Confusing(null);
          }
          }
          傳遞給構(gòu)造器的參數(shù)是一個空的對象引用,因此,初看起來,該程序好像應(yīng)該調(diào)用參數(shù)類型為Object的重載版本,并且將打印出Object。另一方面,數(shù)組也是引用類型,因此null也可以應(yīng)用于類型為double[ ]的重載版本。你由此可能會得出結(jié)論:這個調(diào)用是模棱兩可的,該程序應(yīng)該不能編譯。如果你試著去運行該程序,就會發(fā)現(xiàn)這些直觀感覺都是不對的:該程序打印的是double array。這種行為可能顯得有悖常理,但是有一個很好的理由可以解釋它。
          Java的重載解析過程是以兩階段運行的。第一階段選取所有可獲得并且可應(yīng)用的方法或構(gòu)造器。第二階段在第一階段選取的方法或構(gòu)造器中選取最精確的一個。如果一個方法或構(gòu)造器可以接受傳遞給另一個方法或構(gòu)造器的任何參數(shù),那么我們就說第一個方法比第二個方法缺乏精確性[JLS 15.12.2.5]。
          在我們的程序中,兩個構(gòu)造器都是可獲得并且可應(yīng)用的。構(gòu)造器Confusing(Object)可以接受任何傳遞給Confusing(double[ ])的參數(shù),因此Confusing(Object)相對缺乏精確性。(每一個double數(shù)組都是一個Object,但是每一個Object并不一定是一個double數(shù)組。)因此,最精確的構(gòu)造器就是Confusing(double[ ]),這也就解釋了為什么程序會產(chǎn)生這樣的輸出。
          如果你傳遞的是一個double[ ]類型的值,那么這種行為是有意義的;但是如果你傳遞的是null,這種行為就有違直覺了。理解本謎題的關(guān)鍵在于在測試哪一個方法或構(gòu)造器最精確時,這些測試沒有使用實際的參數(shù):即出現(xiàn)在調(diào)用中的參數(shù)。這些參數(shù)只是被用來確定哪一個重載版本是可應(yīng)用的。一旦編譯器確定了哪些重載版本是可獲得且可應(yīng)用的,它就會選擇最精確的一個重載版本,而此時使用的僅僅是形式參數(shù):即出現(xiàn)在聲明中的參數(shù)。
          要想用一個null參數(shù)來調(diào)用Confusing(Object)構(gòu)造器,你需要這樣寫代碼:new Confusing((Object)null)。這可以確保只有Confusing(Object)是可應(yīng)用的。更一般地講,要想強制要求編譯器選擇一個精確的重載版本,需要將實際的參數(shù)轉(zhuǎn)型為形式參數(shù)所聲明的類型。
          以這種方式來在多個重載版本中進行選擇是相當(dāng)令人不快的。在你的API中,應(yīng)該確保不會讓客戶端走這種極端。理想狀態(tài)下,你應(yīng)該避免使用重載:為不同的方法取不同的名稱。當(dāng)然,有時候這無法實現(xiàn),例如,構(gòu)造器就沒有名稱,因而也就無法被賦予不同的名稱。然而,你可以通過將構(gòu)造器設(shè)置為私有的并提供公有的靜態(tài)工廠,以此來緩解這個問題[EJ Item 1]。如果構(gòu)造器有許多參數(shù),你可以用Builder模式[Gamma95]來減少對重載版本的需求量。
          如果你確實進行了重載,那么請確保所有的重載版本所接受的參數(shù)類型都互不兼容,這樣,任何兩個重載版本都不會同時是可應(yīng)用的。如果做不到這一點,那么就請確保所有可應(yīng)用的重載版本都具有相同的行為[EJ Item 26]。
          總之,重載版本的解析可能會產(chǎn)生混淆。應(yīng)該盡可能地避免重載,如果你必須進行重載,那么你必須遵守上述方針,以最小化這種混淆。如果一個設(shè)計糟糕的API強制你在不同的重載版本之間進行選擇,那么請將實際的參數(shù)轉(zhuǎn)型為你希望調(diào)用的重載版本的形式參數(shù)所具有的類型。   回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 镇江市| 澜沧| 习水县| 万源市| 日喀则市| 萨迦县| 郓城县| 化德县| 厦门市| 西宁市| 苏州市| 二手房| 黄山市| 永福县| 凌云县| 绥阳县| 攀枝花市| 南岸区| 泰安市| 新建县| 山西省| 宁都县| 全南县| 固原市| 石景山区| 如皋市| 霸州市| 交口县| 措勤县| 云和县| 夏河县| 上犹县| 托里县| 揭东县| 平利县| 达拉特旗| 仪征市| 临武县| 武川县| 定襄县| 深州市|