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

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

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

    隨筆-128  評(píng)論-55  文章-5  trackbacks-0

    內(nèi)部類:定義在其他類里面的類。
    使用內(nèi)部類的理由:
    1.內(nèi)部類方法能夠訪問(wèn)外部類的任何數(shù)據(jù)成員包括私有成員。
    2.對(duì)同一個(gè)包的其他類,內(nèi)部類是不可見(jiàn)的。
    3.匿名內(nèi)部類能夠方便的定義回調(diào)而不用寫太多代碼。

    非靜態(tài)內(nèi)部類沒(méi)有默認(rèn)的構(gòu)造函數(shù)(無(wú)參數(shù)的),非靜態(tài)內(nèi)部類的構(gòu)造函數(shù)都有一個(gè)final的外圍類對(duì)象引用this$0。
    內(nèi)部類的特殊語(yǔ)法規(guī)則:
    1.相對(duì)內(nèi)部類,引用其外部類隱式對(duì)象的形式:OuterClass.this
    2.調(diào)用內(nèi)部類的構(gòu)造函數(shù):outerObject.new InnerClass(construction parameters);
    3.外部類外面引用內(nèi)部類:OuterClass.InnerClass

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

    當(dāng)內(nèi)部類是靜態(tài)內(nèi)部類時(shí):
    Compiled from "Outer.java"
    public class Outer$Inner extends java.lang.Object{
    ??? public Outer$Inner(); //沒(méi)有了對(duì)外部類對(duì)象的引用
    }


    如下代碼模擬了上面內(nèi)部類的情形唯一不同的是這里的Inner沒(méi)有訪問(wèn)Outer私有數(shù)據(jù)的權(quán)限:
    class Outer{
    ?? Inner in = new Inner(this);
    }

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

    ?

    //那么權(quán)限是如何控制的呢?當(dāng)內(nèi)部類中的方法訪問(wèn)到外部類的私有數(shù)據(jù)時(shí)(注意如果內(nèi)部類沒(méi)有方法去訪問(wèn)外部類的私有數(shù)據(jù)不會(huì)生成該靜態(tài)方法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);
    ??}
    ?}
    }

    相應(yīng)的外部類詳細(xì)源碼如下:
    public class Outer
    {
    ?? public Outer();

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

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

    局部?jī)?nèi)部類:定義在方法之中,因此局部類沒(méi)有public和private修飾符。對(duì)外界是完全隱藏的。
    局部類不僅能夠訪問(wèn)外部類,還能訪問(wèn)方法中的局部變量(或方法的參數(shù))。不過(guò)那些局部變量要聲明為final的。


    匿名內(nèi)部類:用外部類+$+數(shù)字的形式表示。一個(gè)外部類中有多個(gè)匿名內(nèi)部類時(shí),其生成的class文件對(duì)應(yīng)有Outer$(1、2、3)的形式表示。注意到該匿名內(nèi)部類是final的。
    final class Outer$1
    {
    ?? Outer$1(Outer);

    ?? public void method();

    ?? final Outer this$0;
    }

    嵌套類:當(dāng)內(nèi)部類不需要訪問(wèn)外部類的數(shù)據(jù)成員時(shí)應(yīng)該使用嵌套類。注意只有內(nèi)部類可以聲明為static的其他不行。
    在接口中聲明的內(nèi)部類自動(dòng)轉(zhuǎn)換為public static的,在接口中定義的成員自動(dòng)都是public static的。

    內(nèi)部類構(gòu)造函數(shù)的可見(jiàn)性與其類的可見(jiàn)性相同。當(dāng)內(nèi)部類是private時(shí)其構(gòu)造函數(shù)也是private的,當(dāng)內(nèi)部類是public的其構(gòu)造函數(shù)也是public的。



    Author: orangelizq
    email: orangelizq@163.com

    歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人
    posted on 2010-04-21 14:57 桔子汁 閱讀(594) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE
    主站蜘蛛池模板: 亚洲乱码国产一区网址| 亚洲中文无码永久免费 | 成人无码WWW免费视频| 日韩精品无码人妻免费视频| 国产精品亚洲精品爽爽| 欧洲亚洲国产清在高| 99免费在线视频| 亚洲免费电影网站| 亚洲成av人片一区二区三区| 久久国产高潮流白浆免费观看| 亚洲va久久久噜噜噜久久狠狠| 中文字幕无码免费久久| 亚洲色偷偷综合亚洲av78| 毛片a级毛片免费观看品善网| 亚洲无限乱码一二三四区| 国产又长又粗又爽免费视频| 亚洲国产成人综合精品| 亚洲成av人片天堂网无码】| 亚洲中文字幕丝袜制服一区| 国产成人免费在线| 亚洲日韩中文字幕| 亚洲无码高清在线观看| 好男人视频在线观看免费看片| 亚洲一线产品二线产品| 我想看一级毛片免费的| 精品亚洲永久免费精品| 野花视频在线官网免费1| 亚洲一区二区久久| 亚洲伦理一区二区| 亚洲一级特黄大片无码毛片| 在线观看特色大片免费视频| 国产99视频精品免费专区| 一区二区三区免费在线观看| 亚洲 欧洲 日韩 综合在线| 91亚洲va在线天线va天堂va国产| 最近最新MV在线观看免费高清 | jyzzjyzz国产免费观看| 亚洲愉拍一区二区三区| 亚洲成a人片在线观看老师| 在线观看91精品国产不卡免费| 一区二区三区视频免费观看|