<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

    Java專題文章博客和開源

    常用鏈接

    統(tǒng)計

    最新評論

    使用內(nèi)部和匿名類優(yōu)化Java代碼

      Java 1.1通過對Java語言規(guī)范進行修改,顯著簡化了一些實用結(jié)構(gòu)的實現(xiàn)。在那些修改中,最引人注目的就是內(nèi)部類和匿名類。如運用得當(dāng),它們可使程序更易理解和維護。下面來看看這些特性具體是如何工作的,如何正確使用它們,以及如何避免一些常見的錯誤。

      內(nèi)部類

      簡單地說,“內(nèi)部類”是在另一個類的內(nèi)部聲明的類。從Java 1.1開始,你可在一個類中聲明另一個類,這與聲明字段和方法非常相似。包裝了內(nèi)部類聲明的類就稱為“外部類”。

      實際上,Java語言規(guī)范還允許你做更多的事情,包括:

      在另一個類或者一個接口中聲明一個類。

      在另一個接口或者一個類中聲明一個接口。

      在一個方法中聲明一個類。

      類和接口聲明可嵌套任意深度。

      清單A是類和接口的一些空白聲明,它演示了這些可能性。

      使用一個import語句,你可像使用其他任何標(biāo)準(zhǔn)類那樣省略package名稱。此外,在外部類中,可利用簡單名稱來引用所有內(nèi)部類和接口(參見清單A中的new語句)。注意從Method1中引用Inner2仍需指定Interface1,因為Inner2在一個不同的級別上。

      表A總結(jié)了清單A中聲明的每個內(nèi)部類和接口的完全限定名稱。用了import語句之后,就可采用較短的形式。當(dāng)然,在外部類中,你還可省略外部類的名稱。

      名稱

      類/接口

      Inner1 mypackage.Inner1

      Interface1 mypackage.Interface1

      Inner2 mypackage.Interface1.Inner2

      Interface2 mypackage.Interface1.Interface2

      Inner3 Inner3對于Method1來說是local的,所以它不可在方法外部訪問

      引用內(nèi)部類

      內(nèi)部類最自然的一種應(yīng)用就是聲明只在另一個類的內(nèi)部使用的類,或者聲明與另一個類密切相關(guān)的類。如清單B所示,它是一個鏈表的簡單實現(xiàn)。由于Node類通常只在LinkedList的范圍內(nèi)使用,所以最好將Node聲明為LinkedList的一個內(nèi)部類。

      適用于類成員的訪問控制修改符也適用于內(nèi)部類;也就是說,內(nèi)部類可以具有package、protected、private和public訪問權(quán)限,它們的語義和正常的語義沒有什么不同。由于Node要在LinkedList的外部使用,所以把它聲明為public。

      然而,修飾符static具有不同的含義。應(yīng)用于內(nèi)部類時,它聲明的類具有與其他類相同的語義,也就是可進行實例化,并像一個標(biāo)準(zhǔn)類那樣使用。惟一的區(qū)別就是它擁有對外部類的所有靜態(tài)成員的完全訪問權(quán)限。清單C展示了一個簡單的程序,它創(chuàng)建一個鏈表,并將它打印到標(biāo)準(zhǔn)輸出設(shè)備。

      非靜態(tài)內(nèi)部類

      如果內(nèi)部類沒有指定static修飾符,就擁有對外部類的所有成員的完全訪問權(quán)限,包括實例字段和方法。為實現(xiàn)這一行為,非靜態(tài)內(nèi)部類存儲著對外部類的實例的一個隱式引用。

      所以,對一個非靜態(tài)內(nèi)部類進行實例化需要采用不同語法的new語句:

      .new

      這種形式的new語句要求外部類的一個實例,使內(nèi)部類能在那個實例的上下文中創(chuàng)建。注意清單A聲明了幾個非靜態(tài)內(nèi)部類,并用標(biāo)準(zhǔn)的new語句在Method1中實例化它們。

      之所以能那樣做,是因為Method1是外部類的一個實例方法,所以new語句會在外部類的一個實例的上下文中隱式地執(zhí)行。只有在外部類的外部或者在其他對象的上下文中實例化一個非靜態(tài)內(nèi)部類時,才需要使用修改過的語法。

      但是,非靜態(tài)內(nèi)部類具有一些限制。尤其是,它們不能聲明靜態(tài)初始化列表和靜態(tài)成員,除非是在常量字段中。此外,方法內(nèi)部聲明的內(nèi)部類不能訪問方法的局部變量和參數(shù),除非它們被初始化成final。

      匿名類

      匿名類是不能有名稱的類,所以沒辦法引用它們。必須在創(chuàng)建時,作為new語句的一部分來聲明它們。

      這就要采用另一種形式的new語句,如下所示:

      new <類或接口> <類的主體>

      這種形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴展,或者實現(xiàn)一個給定的接口。它還創(chuàng)建那個類的一個新實例,并把它作為語句的結(jié)果而返回。要擴展的類和要實現(xiàn)的接口是new語句的操作數(shù),后跟匿名類的主體。

      如果匿名類對另一個類進行擴展,它的主體可以訪問類的成員、覆蓋它的方法等等,這和其他任何標(biāo)準(zhǔn)的類都是一樣的。如果匿名類實現(xiàn)了一個接口,它的主體必須實現(xiàn)接口的方法。

      注意匿名類的聲明是在編譯時進行的,實例化在運行時進行。這意味著for循環(huán)中的一個new語句會創(chuàng)建相同匿名類的幾個實例,而不是創(chuàng)建幾個不同匿名類的一個實例。

      從技術(shù)上說,匿名類可被視為非靜態(tài)的內(nèi)部類,所以它們具有和方法內(nèi)部聲明的非靜態(tài)內(nèi)部類一樣的權(quán)限和限制。

      如果要執(zhí)行的任務(wù)需要一個對象,但卻不值得創(chuàng)建全新的對象(原因可能是所需的類過于簡單,或者是由于它只在一個方法內(nèi)部使用),匿名類就顯得非常有用。匿名類尤其適合在Swing應(yīng)用程序中快速創(chuàng)建事件處理程序。

      清單D就是一個非常簡單的Swing應(yīng)用程序,它展示了與匿名類有關(guān)的幾個概念。這個例子創(chuàng)建了兩個匿名類。第一個對java.awt.event.WindowAdapter進行擴展,并在應(yīng)用程序窗口關(guān)閉時調(diào)用應(yīng)用程序的onClose方法。

      即使onClose聲明為private,匿名類也能調(diào)用它,因為匿名類本質(zhì)上是應(yīng)用程序類的一個內(nèi)部類。第二個匿名類實現(xiàn)了java.awt.ActionListener接口,它在一個按鈕被按下后關(guān)閉應(yīng)用程序窗口。注意匿名類可以訪問本地變量frame。這是由于匿名類在與frame相同的方法內(nèi)部聲明。然而,frame要被聲明為final,否則會生成編譯錯誤。

      更優(yōu)化的代碼

      內(nèi)部和匿名類是Java 1.1為我們提供的兩個出色的工具。它們提供了更好的封裝,結(jié)果就是使代碼更容易理解和維護,使相關(guān)的類都能存在于同一個源代碼文件中(這要歸功于內(nèi)部類),并能避免一個程序產(chǎn)生大量非常小的類 www.qcwy123.com  托福答案

    posted on 2014-02-08 15:26 好不容易 閱讀(142) 評論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 亚洲色欲色欲www在线播放| 亚洲校园春色另类激情| 九九全国免费视频| 国产18禁黄网站免费观看| 亚洲色丰满少妇高潮18p| 国产成人青青热久免费精品| 久久亚洲AV成人无码国产电影| 在线精品免费视频| 亚洲成a人无码亚洲成www牛牛| 午夜一级免费视频| 老司机午夜性生免费福利 | 免费夜色污私人影院网站| 日本一道本高清免费| 黄色a三级免费看| 久久久久亚洲精品男人的天堂| 中文字幕在线视频免费| 亚洲综合日韩中文字幕v在线 | 亚洲国产精品不卡毛片a在线| 未满十八私人高清免费影院| 亚洲熟妇无码AV在线播放| 嫩草在线视频www免费观看| 亚洲成a人片毛片在线| 免费无码不卡视频在线观看| 三年片在线观看免费观看大全中国| 亚洲精品无码成人片久久| 1000部禁片黄的免费看| AV激情亚洲男人的天堂国语| 在线观看亚洲精品福利片| 999久久久免费精品播放| 亚洲日韩一区二区一无码| 亚洲日本va午夜中文字幕久久| 久久青草免费91观看| 亚洲AV综合色区无码一二三区| 亚洲综合色婷婷七月丁香| 国产精品久久久久久久久免费| 午夜亚洲乱码伦小说区69堂| 久久久久亚洲精品成人网小说| 麻豆国产精品入口免费观看| 免费看黄的成人APP| 亚洲国产成人AV在线播放| 亚洲Av无码精品色午夜|