Java 四種內部類實例

內部類:成員內部類、靜態內部類、局部內部類和匿名內部類。

  • 成員內部類
package com.jiaoyinbrother.test;

/* 
 * 成員內部類可以調用外部類的所有成員,但只有在創建了外部類的對象後,才能調用外部的成員。
 */
public class OuterClass {
    private static String charSet = "UTF-8";
    private String name = "zhangsan";
    public InnerClass innerClass = new InnerClass();

    public void show() {
        innerClass.print();
    }

    public void display() {// 非靜態方法可以直接創建內部類對象
        InnerClass innerClass = new InnerClass();
        innerClass.print();
    }

    public static void display1() {// 靜態方法必須先創建外部類,然後才能創建內部類
        InnerClass innerClass = new OuterClass().new InnerClass();
        innerClass.print();
    }

    // 成員內部類
    public class InnerClass {
        public void print() {
            System.out.println("-----------inner class----------");
            System.out.println(name);
            System.out.println(charSet);
        }
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.show();
        outerClass.display();

        outerClass.innerClass.print();
    }

}
  • 靜態內部類
package com.jiaoyinbrother.test;

/* 
 * 靜態內部類雖然是外部類的成員,但是在未創建外部類的對象的情況下,可以直接創建靜態內部類的對象。
 * 靜態內部類可以引用外部類的靜態成員變量和靜態方法,但不能引用外部類的普通成員。
 */
public class OuterClass1 {
    private static String charSet = "UTF-8";

    private String name = "zhangsan";
    public InnerClass innerClass = new InnerClass();

    public void show() {
        innerClass.print();
    }

    public void display() {
        InnerClass innerClass = new InnerClass();
        innerClass.print();
    }

    // 無需外部類對象,直接創建靜態內部類對象
    public static void display1() {
        InnerClass innerClass = new InnerClass();
        innerClass.print();
    }

    // 靜態內部類
    public static class InnerClass {
        public void print() {
            System.out.println("-----------static inner class----------");
            System.out.println(charSet);
            // System.out.println(name);//編譯失敗,不能引用非靜態成員變量
        }
    }

    public static void main(String[] args) {
        OuterClass1 outerClass = new OuterClass1();
        outerClass.show();
        outerClass.display();

        outerClass.innerClass.print();

        InnerClass innerClass = new InnerClass();
        innerClass.print();
    }

}
  • 局部內部類
package com.jiaoyinbrother.test;

/* 
 * 局部內部類只能在方法內部中使用,一旦方法執行完畢,局部內部類就會從內存中刪除。
 * 必須注意:如果局部內部類中要使用他所在方法中的局部變量,那麼就需要將這個局部變量定義爲final的。
 */
public class OuterClass2 {
    private static String charSet = "UTF-8";
    private String name = "zhangsan";

    public void show() {
        final int i = 1;

        class InnerClass {// 修飾符只能爲final或者abstract
            public void print() {
                System.out.println(charSet);
                System.out.println(name);
                System.out.println(i);// 局部變量必須爲final
            }
        }

        InnerClass innerClass = new InnerClass();// 只能在聲明後創建對象
        innerClass.print();
    }

    public static void main(String[] args) {
        OuterClass2 outerClass = new OuterClass2();
        outerClass.show();

    }

}
  • 匿名內部類
package com.jiaoyinbrother.test;

/* 
 * 匿名內部類的主體,大括號中是匿名內部類的主體,這個主體就是類或者接口的實現,
 * 如果是類,那麼匿名內部類是該類的子類,如果是接口,匿名內部類需要完成接口的實現。
 */
public class OuterClass3 {

    public void show(InnerClass innerClass) {
        innerClass.print();
    }

    public static void main(String[] args) {
        OuterClass3 outerClass = new OuterClass3();
        outerClass.show(new InnerClass() {
            @Override
            public void print() {
                System.out.println("匿名內部類");
            }
        });
    }

}

abstract class InnerClass {
    public abstract void print();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章