尚學堂-Day011

每天早上都是想幹翻這個世界,晚上回來時被這個世界乾的服服帖帖。被生活瘋狂蹂躪,依然熱愛生活。

  • 內部類
    • 成員內部類
    • 私有內部類
    • 靜態內部類
    • 局部內部類
    • 匿名內部類
  • 枚舉

零、內部類

內部類就是類中的類

1、內部類的作用

  • 內部類可以很好的實現隱藏
    • 一般的非內部類,是不允許有privateprotected權限的,但是內部類可以
  • 內部類擁有外部類的所有元素的訪問權限(包含private)
  • 可以實現多重繼承
  • 匿名內部類優化接口

一、成員內部類

成員內部類就類似與類的成員屬性,不在方法內部的類叫做成員內部類。

成員內部類可以無條件的訪問外部類所有成員屬性和方法(包含priavtestatic)

1、成員內部類創建對象

// 外部類
public class A {
    public A() {
        System.out.println("外部類");
    }
    // 成員內部類
    class A1{
        public A1() {
            System.out.println("成員內部類");
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        A.A1 a1 = new A().new A1();
        A a = new A();
        A.A1 a2 = a.new A1();
    }
}
運行結果
外部類
成員內部類
外部類
成員內部類

成員內部類創建對象格式

外部類.內部類 變量名 = new 外部類().new 內部類();

或者

外部類 變量名1 = new 外部類();
外部類.內部類 變量名2 = 變量名1.new 內部類();

成員內部類創建對象會先創建外部類對象。

2、成員內部類訪問外部類屬性和方法

// 外部類
public class A {
    private String str = "外部類的String變量";        // 私有的成員屬性
    public A() {
        System.out.println("外部類");
    }
    private void ab(){
        System.out.println("外部類ab()方法");
    }
    // 成員內部類
    class A1{
        String str = "內部類的String變量";
        public A1() {
            System.out.println("成員內部類");
        }
        public void a1(){
            System.out.println(str);        // 調用的內部類的屬性
            System.out.println(A.this.str); // 調用的外部類的屬性
            ab();                           // 調用內部類的方法
            A.this.ab();                    // 調用調用外部類方法

            // 創建外部類對象訪問
            A a = new A();
            System.out.println(a.str);
            a.ab();

        }
        public void ab(){
            System.out.println("內部類ab()方法");
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        A.A1 a1 = new A().new A1();
        a1.a1();
    }
}
運行結果
外部類
成員內部類
內部類的String變量
外部類的String變量
內部類ab()方法
外部類ab()方法
外部類
外部類的String變量
外部類ab()方法

可以通過外部類類名.this.方法名外部類類名.this.屬性來訪問外部類的方法或者屬性

也可以以普通方式在內部類中創建外部類的對象來訪問

內部類可以訪問外部類私有的屬性和方法

二、私有內部類

如果一個內部類只希望被外部類的方法操作,則可以使用private修飾聲明內部類爲私有內部類

public class A {
    private class AB{
        void ab1(){
            System.out.println("私有內部類ab1()方法");
        }
    }


    void a(){
        AB ab = new AB();
        ab.ab1();
    }
}
public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.a();
    }
}
運行結果
私有內部類ab1()方法

內部類無法通過外部類.內部類 變量名 = new 外部類().new 內部類();創建對象,只能在外部類中使用內部類,創建內部類對象

三、靜態內部類

靜態內部類類似靜態方法,只能訪問靜態的外部類的成員變量和方法

public class A {
    static int a;

    public A() {
        System.out.println("外部類");
    }

    static class AB{
        public AB() {
            System.out.println("靜態內部類");
        }

        void ab(){
            System.out.println(a);
            System.out.println("我是靜態內部方法");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        A.AB ab = new A.AB();
        ab.ab();
    }
}
運行結果
靜態內部類
0
我是靜態內部方法

靜態內部類使用A.AB ab = new A.AB();創建對象

四、局部內部類

局部內部類類似與局部變量,只能在局部內使用

public class Test {
    public static void main(String[] args) {
        class A{
            public A() {
                System.out.println("我是局部內部類");
            }
        }
        A a = new A();
    }
}
運行結果
我是局部內部類

局部內部類只能在方法內使用,超出作用域將不能使用

五、匿名內部類

匿名內部類就是沒有名字的類,一般如果某個類只使用一次,則可以將類定義爲匿名內部類

public class A {
    void a1(){
    }
}
public abstract class B {
    abstract void a1();
}
public interface C {
    String a1();
}
public class Test {
    public static void main(String[] args) {
        new A(){
            @Override
            void a1() {
                System.out.println("匿名內部類A");
            }
        }.a1();
        B b = new B(){
            @Override
            void a1() {
                System.out.println("匿名內部類B");
            }
        };
        b.a1();
        System.out.println(new C() {
            @Override
            public String a1() {
                return "匿名內部類C";
            }
        }.a1());
    }
}

匿名內部類可以繼承一個普通類或者抽象類或者實現一個接口,但是隻能同時實繼承或實現一個

如果實現了一個接口,該類是Object類的直接子類。匿名類繼承一個類或者實現一個類,不需要extends或者implements關鍵字

由於匿名內部類沒有名稱,所以類體中不能定義構造器,也不能使用關鍵字創建該類的實例

匿名內部類的定義、構造、和第一次使用都發生在同一個地方

六、枚舉

枚舉可以理解爲一個特殊的類,通過關鍵字enum實現,自動繼承Enum類

public class Test {
    public static void main(String[] args) {
        Color color = Color.GREEN;
        System.out.println(color.ordinal());        // 獲取枚舉值的順序次數,從0開始
        switch (color){
            case RED:
                System.out.println("紅色");
                break;
            case YELLOW:
                System.out.println("黃色");
                break;
            case GREEN:
                System.out.println("綠色");
                break;
        }
    }
}
運行結果
2
綠色
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章