1. 程式人生 > >java日常學習:內部類、區域性內部類、匿名內部類

java日常學習:內部類、區域性內部類、匿名內部類

java程式碼塊

內部類

內部類: 在一個類的內部定義另外一個類,那麼另外一個類則稱作為內部類 。

內部類的class檔名: 外部類$內部類.class

成員內部類:

成員內部類的訪問方式:
方式一: 在外部類提供一個方法建立內部類的物件進行訪問。

    方式二:在其他類中直接建立內部的物件進行訪問。
                格式: 
                    外部類.內部類  變數名  = new 外部類().new 內部類();

    注意:靜態成員內部類在其他類建立物件的格式:
                    外部類.內部類  變數名  =  new 外部類.內部類();

內部類的好處: 直接訪問外部類的所有成員。

應用場景: 我們在描述A事物的時候,A事物內部還維護了另外一個B事物,
而且B事物還必須 要訪問到A事物的成員,那麼這時候我們就可以使用內部類描述B事物。

比如: 人– 心臟 . 圖形化介面程式設計

成員內部類要注意的細節:
1. 內部類可以直接訪問外部類的所有成員。
2. 內部類與外部類存在同名的成員時, 在內部類中預設是訪問內部類的成員, 可以通過”外部類.this.成員”進行指定訪問外部類的成員。
3. 私有的成員內部類只能通過在外部類提供一個公共的方法進行訪問。 在其他類無法訪問。
4. 如果一個成員內部類定義了靜態的成員,那麼該類也必須使用static修飾。

疑問:為什麼如果一個成員內部類定義了靜態的成員,那麼該類也必須使用static修飾 ???

        靜態的成員變數是不依賴物件而存在的

區域性內部類

區域性內部類:在一個方法內部定義的類稱作為區域性內部類。

區域性內部類要注意的細節:
1. 如果區域性內部類要訪問區域性變數,那麼區域性變數必須使用final去修飾。

匿名內部類

匿名內部類:沒有類名的內部類就稱作為匿名內部類。

匿名內部類的好處: 簡化書寫。

匿名內部類的使用前提: 必須存在繼承或者實現的關係。

注意的事項:
1. 匿名內部類只是沒有類名而已,其他的一切成員都是具備的。

實現關係下的匿名內部類:

interface Dao{

    public void add();
}

class Outer{

    //實現關係下的匿名內部類
    public void show(){
        //這裡建立的不是Dao介面的物件,建立的是Dao介面實現類的物件。
        new Dao(){

            public void add(){
                System.out.println("新增成功..");
            }
        }.add();

    }
}

練習

/*
需求: 定義一個區域性內部類繼承Animal,建立物件呼叫run方法。
*/
abstract class Animal {
    public abstract void run();
    public abstract void sleep();
}

class Outer {
    public void print (){
        /*
        class Cat{
            public  void run(){
                System.out.println("小貓跑的快!");
            }
            public  void sleep(){
                System.out.println("小貓在睡覺!");
            }
        }
        //建立區域性內部類的物件
        Cat c = new Cat();
        c.run();
        c.sleep();
        */
        //匿名內部類只是沒有類名而已,其他的一切成員都是具備的;
        //多型
        Animal a = new Animal(){   //  這裡建立的並不是Animal的物件,建立的是Animal的子類物件,只不過其子類目前沒有類名借用了ANimal名字而已;
            //匿名內部類的成員;
            String name;   //證明匿名內部成員是可以具備的;
            public  void run(){
                System.out.println("小貓跑的快!");
            }
            public  void sleep(){
                System.out.println("小貓在睡覺!");
            }    //在不宣告變數接收的情況下,這裡可以直接 .run/.sleep;
        };
        a.run();
        a.sleep();
    }
}

class Demo2
{
    public static void main(String[] args) 
    {
        new Outer().print();
    }
}

用於平時自己複習回顧,如有錯誤,歡迎指正