Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評(píng)論 - 589, 引用 - 0
          數(shù)據(jù)加載中……

          理解Java內(nèi)部類的基本特性(二)

          作者:Flyingis

          4. 
          內(nèi)部類擁有其外圍類的所有元素的訪問權(quán),當(dāng)某個(gè)外圍類的對(duì)象創(chuàng)建了一個(gè)內(nèi)部類對(duì)象時(shí),此內(nèi)部類對(duì)象必定會(huì)保存一個(gè)指向那個(gè)外圍類對(duì)象的引用。然后,在訪問此外圍類的成員時(shí),就是用那個(gè)“隱藏”的引用來(lái)選擇外圍類的成員。這與C++嵌套類的設(shè)計(jì)非常不同,在C++中只是單純的名字隱藏機(jī)制,與外圍對(duì)象沒有聯(lián)系,也沒有隱含的訪問權(quán)。

                   另外,一個(gè)內(nèi)部類被嵌套多少層并不重要,它能透明訪問所有它所嵌入的外圍類的所有成員。

          5.  Java中實(shí)現(xiàn)C++的嵌套類功能也是通過(guò)嵌套類的機(jī)制來(lái)實(shí)現(xiàn)的,區(qū)別是C++中的嵌套類不能訪問私有成員,在Java中則可以。

                   Java中,使用嵌套類可以使得內(nèi)部類對(duì)象與其外圍類對(duì)象之間有聯(lián)系,語(yǔ)法上是將內(nèi)部類聲明為static。而在普通的內(nèi)部類中是不能有static數(shù)據(jù)、static字段和嵌套類的。通常,我們可以在一個(gè)普通的內(nèi)部類中,通過(guò)一個(gè)特殊的this引用鏈接到其外圍類對(duì)象,如外圍類是Fruit,那么在內(nèi)部類中應(yīng)該通過(guò)Fruit.this來(lái)引用外圍類的對(duì)象。

          6.  內(nèi)部類的繼承比較特殊,我通過(guò)一個(gè)例子來(lái)向大家展示:

          class Fruit {

            class Inner {}

          }

          public class Apple extends Fruit.Inner {

            Apple(Fruit f) {

              f.super(); //為什么要這樣使用我也不明白

          }

          public static void main(String[] args) {

            Fruit f = new Fruit();

            Apple a = new Apple(f);

          }

          }

                   其中為什么要外圍類調(diào)用super()方法我也不清楚,希望有人指點(diǎn)!

          7.  當(dāng)繼承某個(gè)外圍類的時(shí)候,內(nèi)部類并沒有發(fā)生任何改變,基類和繼承類中的兩個(gè)內(nèi)部類是完全獨(dú)立的實(shí)體,各自在自己的命名空間內(nèi)。如果明確繼承某個(gè)內(nèi)部類,則會(huì)覆蓋原來(lái)的內(nèi)部類。如:

          public class A extends Atop {

            public Inner extends Atop.Inner {}

          }

          8.  局部?jī)?nèi)部類和匿名內(nèi)部類在功能上基本相似,它們的區(qū)別在于,如果我們需要一個(gè)已命名的構(gòu)造器,或者需要重載構(gòu)造器,就要使用局部?jī)?nèi)部類,它可以提供多個(gè)內(nèi)部類對(duì)象。匿名內(nèi)部類只能用于實(shí)例初始化。

          9.  內(nèi)部類標(biāo)識(shí)符是外圍類的名字+$+內(nèi)部類的名字,如果內(nèi)部類是匿名的,則會(huì)由編譯器產(chǎn)生一個(gè)數(shù)字作為其標(biāo)識(shí)符。

          posted on 2005-11-04 18:55 Flyingis 閱讀(1978) 評(píng)論(4)  編輯  收藏 所屬分類: JavaSE

          評(píng)論

          # re: 理解Java內(nèi)部類的基本特性(二)[原創(chuàng)]  回復(fù)  更多評(píng)論   

          其中為什么要外圍類調(diào)用super()方法?
          這個(gè)問題,think in java上有解釋,
          在第八章:接口和內(nèi)隱類 ——繼承inner classes
          你可以去看看
          2005-11-05 12:06 | allen

          # re: 理解Java內(nèi)部類的基本特性(二)[原創(chuàng)]  回復(fù)  更多評(píng)論   

          內(nèi)部類從運(yùn)行時(shí)理解更簡(jiǎn)單:
          只要不是 static 聲明的內(nèi)部類運(yùn)行時(shí),實(shí)例必定附著于一個(gè)外部類實(shí)例,而不能單獨(dú)創(chuàng)建。
          但是 static 內(nèi)部類的運(yùn)行時(shí)表現(xiàn)相同于外部類。
          2005-12-13 11:23 | 笨笨

          # re: 理解Java內(nèi)部類的基本特性(二)[原創(chuàng)]  回復(fù)  更多評(píng)論   

          文章中第六點(diǎn)我還是沒有弄明白。為什么一定要聲明調(diào)用基類的默認(rèn)構(gòu)造方法?
          2005-12-13 12:28 | Flyingis

          # re: 理解Java內(nèi)部類的基本特性(二)  回復(fù)  更多評(píng)論   

          不錯(cuò)過(guò)西
          2005-12-30 17:32 | 南木林
          主站蜘蛛池模板: 潜山县| 靖宇县| 永州市| 射洪县| 合水县| 大悟县| 临猗县| 定日县| 新巴尔虎右旗| 曲麻莱县| 城市| 巴青县| 宜春市| 连山| 延安市| 榆林市| 永平县| 石楼县| 河北区| 隆德县| 宁阳县| 惠安县| 正蓝旗| 岳普湖县| 南涧| 若尔盖县| 望城县| 本溪市| 吉木萨尔县| 贵南县| 平舆县| 共和县| 方城县| 兴安盟| 麻城市| 西华县| 平昌县| 靖边县| 柯坪县| 思茅市| 夏河县|