1. 程式人生 > >黑馬程式設計師—面向物件之內部類

黑馬程式設計師—面向物件之內部類

------- android培訓java培訓、期待與您交流! ----------


內部類:

如果A類需要直接訪問B類中的成員,而B類又需要建立A類的物件。這時,為了方便設計和訪問,直接將A類定義在B類中。就可以了。A類就稱為內部類。內部類可以直接訪問外部類中的成員。而外部類想要訪問內部類,必須要建立內部類的物件。

class Outer{
    int num = 4;   
    class  Inner {
        void show(){
            System.out.println("innershow run "+num);         
        }
    }
    public void method(){
        Inner in = newInner();//建立內部類的物件。
        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("showrun");            
            }
        }.show();
        //2
        Object obj = newObject(){
            void show(){
                System.out.println("showrun");
            }
        };
        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 voidmain(String[] args) {//static不允許this
        This.new Inner().show();//錯誤,Inner類需要定義成static
    }
}
------------------------------------------------------
interface Inter{
    void show();
}
class Outer{//通過匿名內部類補足Outer類中的程式碼。
    publicstatic Inter method(){
        returnnew Inter(){
            publicvoid show(){}
        };
    }
}
class InnerClassDemo7 {
    public static voidmain(String[] args) {
        Outer.method().show();
    /*
        Outer.method():意思是:Outer中有一個名稱為method的方法,而且這個方法是靜態的。
        Outer.method().show():當Outer類呼叫靜態的method方法運算結束後的結果又呼叫了show方法,意味著:method()方法運算完一個是物件,而且這個物件是Inter型別的。
    */
        function (new Inter(){
            publicvoid show(){}
        });//匿名內部類作為方法的引數進行傳遞。
    }
    publicstatic void function(Inter in){
        in.show();
    }
}