內部類

內部類:若是A類須要直接訪問B類中的成員,而B類又須要創建A類的對象。這時,爲了方便設計和訪問,直接將A類定義在B類中。就能夠了。A類就稱爲內部類。內部類能夠直接訪問外部類中的成員。而外部類想要訪問內部類,必需要創建內部類的對象。java

-----------------------------------------------------面試

class Outer{函數

    int num = 4;    this

    class  Inner {spa

        void show(){設計

            System.out.println("inner show run "+num);          對象

        }繼承

    }接口

    public void method(){io

        Inner in = new Inner();//建立內部類的對象。

        in.show();//調用內部類的方法。

    }

}

-------------------------------------------------------

當內部類定義在外部類中的成員位置上,可使用一些成員修飾符修飾 private、static。

1:默認修飾符。

直接訪問內部類格式:外部類名.內部類名 變量名 =  外部類對象.內部類對象;

Outer.Inner in = new Outer.new Inner();//這種形式不多用。

  可是這種應用很少見,由於內部類之因此定義在內部就是爲了封裝。想要獲取內部類對象一般都經過外部類的方法來獲取。這樣能夠對內部類對象進行控制。

2:私有修飾符。

  一般內部類被封裝,都會被私有化,由於封裝性不讓其餘程序直接訪問。

3:靜態修飾符。

  若是內部類被靜態修飾,至關於外部類,會出現訪問侷限性,只能訪問外部類中的靜態成員。

  注意;若是內部類中定義了靜態成員,那麼該內部類必須是靜態的。

 

內部類編譯後的文件名爲:「外部類名$內部類名.java」;

 

爲何內部類能夠直接訪問外部類中的成員呢?

那是由於內部中都持有一個外部類的引用。這個是引用是 外部類名.this

內部類能夠定義在外部類中的成員位置上,也能夠定義在外部類中的局部位置上。

當內部類被定義在局部位置上,只能訪問局部中被final修飾的局部變量。

 

匿名內部類:沒有名字的內部類。就是內部類的簡化形式。通常只用一次就能夠用這種形式。匿名內部類其實就是一個匿名子類對象想要定義匿名內部類:須要前提,內部類必須繼承一個類或者實現接口。

 

匿名內部類的格式:new 父類名&接口名(){ 定義子類成員或者覆蓋父類方法 }.方法。

 

匿名內部類的使用場景:

當函數的參數是接口類型引用時,若是接口中的方法不超過3個。能夠經過匿名內部類來完成參數的傳遞。

其實就是在建立匿名內部類時,該類中的封裝的方法不要過多,最好兩個或者兩個之內。

--------------------------------------------------------

//面試

        //1

        new Object(){

            void show(){

                System.out.println("show run");            

            }

        }.show();

        //2

        Object obj = new Object(){

            void show(){

                System.out.println("show run");

            }

        };

        obj.show();

       

        1和2的寫法正確嗎?有區別嗎?說出緣由。

        寫法是正確,1和2都是在經過匿名內部類創建一個Object類的子類對象。

        區別:

        第一個但是編譯經過,並運行。

        第二個編譯失敗,由於匿名內部類是一個子類對象,當用Object的obj引用指向時,就被提高爲了

        Object類型,而編譯時檢查Object類中是否有show方法,因此編譯失敗。

-------------------------------------------------------

class InnerClassDemo6 {

    +(static)class Inner{

        void show(){}

    }

    public void method(){

        this.new Inner().show();//能夠

    }

    public static void main(String[] args) {//static不容許this

        This.new Inner().show();//錯誤,Inner類須要定義成static

    }

}

------------------------------------------------------

interface Inter{

    void show();

}

class Outer{//經過匿名內部類補足Outer類中的代碼。

    public static Inter method(){

        return new Inter(){

            public void show(){}

        };

    }

}

class InnerClassDemo7 {

    public static void main(String[] args) {

        Outer.method().show();

    /*

        Outer.method():意思是:Outer中有一個名稱爲method的方法,並且這個方法是靜態的。

        Outer.method().show():當Outer類調用靜態的method方法運算結束後的結果又調用了show方法,意味着:method()方法運算完一個是對象,並且這個對象是Inter類型的。

    */

        function (new Inter(){

            public void show(){}

        }); //匿名內部類做爲方法的參數進行傳遞。

    }

    public static void function(Inter in){

        in.show();

    }

}

相關文章
相關標籤/搜索