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

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

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

    隨筆 - 63  文章 - 0  trackbacks - 0
    <2009年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    內部類:定義在其他類里面的類。
    使用內部類的理由:
    1.內部類方法能夠訪問外部類的任何數據成員包括私有成員。
    2.對同一個包的其他類,內部類是不可見的。
    3.匿名內部類能夠方便的定義回調而不用寫太多方法。

    非靜態內部類沒有默認的構造函數,非靜態內部類的構造函數都有一個外圍類對象的引用。
    內部類的特殊語法規則:
    1.相對內部類,引用其外部類隱式對象的形式:OuterClass.this
    2.調用內部類的構造函數:outerObject.new InnerClass(construction parameters);
    3.外部類外面引用內部類:OuterClass.InnerClass

    內部類是一種編譯器現象與虛擬機無關。編譯器將內部類翻譯為用$分隔外部類名和內部類名的常規類文件,虛擬機對此并無所知。
    使用javap -private OuterClass$InnerClass。javap這個工具確實挺不錯的,對分析字節碼和源碼都有很大的幫助。
    可以看出詳細的內部類源碼清單,其中包括了編譯器自動添加的部分:
    public class Outer
    {
     public class Inner
     {
     }
    }
    當內部類是非靜態內部類時相應的內部類的詳細源碼如下:
    Compiled from "Outer.java"
    public class Outer$Inner extends java.lang.Object{
        final Outer this$0;  //編譯器自動在內部類里面添加了指向外部類對象的引用
        public Outer$Inner(Outer);  //內部類的構造函數默認有一個外部類對象作為參數。
    }

    當內部類是靜態內部類時:
    Compiled from "Outer.java"
    public class Outer$Inner extends java.lang.Object{
        public Outer$Inner(); //沒有了對外部類對象的引用
    }


    如下代碼模擬了上面內部類的情形唯一不同的是這里的Inner沒有訪問Outer私有數據的權限:
    class Outer{
       Inner in = new Inner(this);
    }

    class Inner{
       public Inner(Outer outer){
          this.outer = outer;
       }
      
       private Outer outer;
    }

     

    //那么權限是如何控制的呢?當內部類中的方法訪問到外部類的私有數據時(注意如果內部類沒有方法去訪問外部類的私有數據不會生成該靜態方法static int access$000(Outer);)
    public class Outer
    {
     private int i;
     public void methodOne()
     {
     }

     class Inner
     {
      public void print(){
       System.out.println(Outer.this.i);
      }
     }
    }

    相應的外部類詳細源碼如下:
    public class Outer
    {
       public Outer();

       public void methodOne();
       static int access$000(Outer); //由編譯器合成的用于內部類對外部類進行特殊訪問權限的控制:這也是
                                    //為什么內部類能夠訪問外部類中的私有數據的原因。
       private int i;
    }

    內部類訪問外部類的private數據的這種方式很可能導致危險,雖然access$000不是一個合法的Java方法名,但是熟悉class文件結構的黑客可以使用十六進制編輯器輕松創建一個用虛擬機指令調用那個方法的類文件。由于隱秘的訪問方法需要擁有包可見性,所以攻擊代碼需要與被攻擊類放在同一個包中。總之,如果內部類訪問了外部類的私有數據域,就有可能通過附加在外部類所在包中的其他類訪問私有數據。

    局部內部類:定義在方法之中,因此局部類沒有public和private修飾符。對外界是完全隱藏的。
    局部類不僅能夠訪問外部類,還能訪問方法中的局部變量(或方法的參數)。不過那些局部變量要聲明為final的。


    匿名內部類:用外部類+$+數字的形式表示。一個外部類中有多個匿名內部類時,其生成的class文件對應有Outer$(1、2、3)的形式表示。注意到該匿名內部類是final的。
    final class Outer$1
    {
       Outer$1(Outer);

       public void method();

       final Outer this$0;
    }

    嵌套類:當內部類不需要訪問外部類的數據成員時應該使用嵌套類。注意只有內部類可以聲明為static的其他不行。
    在接口中聲明的內部類自動轉換為public static的,在接口中定義的成員自動都是public static的。

    內部類構造函數的可見性與其類的可見性相同。

     

    posted on 2009-04-16 14:06 lanxin1020 閱讀(154) 評論(0)  編輯  收藏 所屬分類: j2se
    主站蜘蛛池模板: 中国一级毛片视频免费看| 亚洲6080yy久久无码产自国产| 亚洲免费一区二区| 亚洲国产午夜福利在线播放| 国产精品久久久久久亚洲影视| 日韩中文无码有码免费视频| 亚洲第一综合天堂另类专| 免费国产成人午夜电影| 尤物视频在线免费观看| 国产专区一va亚洲v天堂| 西西人体免费视频| 亚洲一区二区在线免费观看| 日本zzzzwww大片免费| 中文字幕亚洲码在线| 日本无卡码免费一区二区三区| 国产成人亚洲精品电影| 亚洲中文字幕无码专区| 久久精品国产免费一区| 亚洲春色在线观看| 国产高清视频在线免费观看| 一级一级一片免费高清| 亚洲AV日韩AV高潮无码专区| 一级女人18毛片免费| 国产亚洲综合视频| 成人午夜亚洲精品无码网站| 99re视频精品全部免费| 亚洲日本VA午夜在线影院| 全黄性性激高免费视频| 麻豆精品不卡国产免费看| 亚洲av无码国产综合专区 | 视频免费在线观看| 亚洲视频免费观看| 免费一级大黄特色大片| 无码一区二区三区免费| 亚洲日韩国产欧美一区二区三区 | 亚洲va无码专区国产乱码| 在线视频免费观看爽爽爽| 羞羞视频免费网站入口| 亚洲日本精品一区二区| 国产99视频免费精品是看6| 四虎成人精品永久免费AV|