各類內部類和枚舉類的使用

內部類不只常常出如今各類面試題中,還會在 Java 源碼中頻頻出現,所以只有搞明白了 Java 內部類,才能搞定面試和看懂各類 Java 源碼。java

內部類

Java 內部類,分爲如下四種:面試

  • 成員內部類
  • 靜態成員內部類
  • 局部內部類
  • 匿名內部類

下面分別來看這些內部類的使用。ide

成員內部類

定義

在一個類中定義了另外一個類,則將定義在類中的那個類稱之爲成員內部類。成員內部類也是最普通的內部類。this

使用

成員內部類的使用示例以下:code

class Outer {
    public Outer() {
        System.out.println("Outer Class.");
    }
    class Inner {
        public void sayHi() {
            System.out.println("Hi, Inner.");
        }
    }
}

其中 Inner 類則爲成員內部類。 而成員內部類的建立和使用,請參考如下完整的示例代碼:對象

class InnerTest {
    public static void main(String[] args) {
        Outer out = new Outer();
        // 建立成員內部類
        Outer.Inner inner = out.new Inner();
        inner.sayHi();
    }
}
class Outer {
    public Outer() {
        System.out.println("Outer Class.");
    }
    class Inner {
        public void sayHi() {
            System.out.println("Hi, Inner.");
        }
    }
}
成員內部類的建立

語法:blog

Outer.Inner inner = new Outer().new Inner();繼承

內部類訪問外部類

語法:接口

Outer.this.xxxip

代碼示例:

class Outer {
    private String name = "OuterClass";
    public void sayHi() {
        System.out.println("Hi, Outer.");
    }
    class Inner {
        public void sayHi() {
            // 內部類訪問外部類
            Outer.this.sayHi();
            System.out.println(Outer.this.name);
            System.out.println("Hi, Inner.");
        }
    }
}
class InnerTest {
    public static void main(String[] args) {
        Outer.Inner inner =  new Outer().new Inner();
        inner.sayHi();
    }
}
外部類訪問內部類

語法:

new Inner().xxx

代碼示例:

class Outer {
    public void sayHi() {
        System.out.println(new Inner().name);
        System.out.println("Hi, Outer.");
    }
    private class Inner {
        String name = "InnerClass";
        public void sayHi() {
            System.out.println("Hi, Inner.");
        }
    }
}
class InnerTest {
    public static void main(String[] args) {
        new Outer().sayHi();
    }
}
小結
  • 成員內部類可直接訪問外部類(使用:外部類.this.xxx);
  • 外部成員類要訪問內部類,必須先創建成員內部類對象;
  • 成員內部類可以使用任意做用域修飾(public、protected、默認、private);
  • 成員內部類可訪問外部類任何做用域修飾的屬性和方法;
  • 外部類創建成員內部類對象以後,能夠訪問任何做用域修飾的內部類屬性和方法。

靜態成員內部類

定義

在一個類中定義了另外一個 static 類,則將定義在類中的那個 static 類稱之爲靜態成員內部類。

靜態成員內部類也就是給內部成員類加上 static 修飾符。

使用

靜態成員內部類的使用示例以下:

class OuterClass {
    public OuterClass() {
        System.out.println("OuterClass Init.");
    }
    protected static class InnerClass {
        public void sayHi() {
            System.out.println("Hi, InnerClass.");
        }
    }
}
class InnerClassTest {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        innerClass.sayHi();
    }
}

與內部成員類的建立方式 new Outer().new Inner() 不一樣,靜態成員內部類可以使用 new OuterClass.InnerClass() 的方式進行建立。

注意:不能從靜態成員內部類中訪問非靜態外部類對象。

局部內部類

定義

一個類定義在另外一個類的局部(方法或者任意做用域),這個類就稱之爲局部內部類。

使用

局部內部類的使用示例以下:

class OutClass {
    public void sayHi() {
        class InnerClass {
            InnerClass(String name) {
                System.out.println("InnerClass:" + name);
            }
        }
        System.out.println(new InnerClass("Three"));
        System.out.println("Hi, OutClass");
    }
}
class OutTest {
    public static void main(String[] args) {
        new OutClass().sayHi();
    }
}
局部內部類特色
  • 局部內部類不能使用任何訪問修飾符;
  • 局部類若是在方法中,能夠直接使用方法中的變量,不須要經過 OutClass.this.xxx 的方式得到。

匿名內部類

定義

沒有名字的內部類就叫作匿名內部類。

使用

匿名內部類的使用示例以下:

interface AnonymityOuter {
    void hi();
}
class AnonymityTest {
    public static void main(String[] args) {
        AnonymityOuter anonymityOuter = new AnonymityOuter() {
            @Override
            public void hi() {
                System.out.println("Hi, AnonymityOuter.");
            }
        };
        anonymityOuter.hi();
    }
}

其中,new AnonymityOuter() 以後的 {…} 大括號包含的部分就爲匿名內部類。

匿名內部類特色
  • 匿名內部類必須繼承一個父類或者實現一個接口
  • 匿名內部類不能定義任何靜態成員和方法
  • 匿名內部類中的方法不能是抽象的

枚舉類

枚舉類是 JDK 1.5 引入的新特性,使用關鍵字「enum」聲明。枚舉功能雖小,卻很是實用,大大方便了程序的開發者。

枚舉類的使用

請參考如下代碼:

enum ColorEnum {
    RED,
    BLUE,
    YELLOW,
    GREEN
}
class EnumTest {
    public static void main(String[] args) {
        ColorEnum color = ColorEnum.GREEN;
        switch (color) {
            case RED:
                System.out.println("Red");
                break;
            case BLUE:
                System.out.println("Blue");
                break;
            case YELLOW:
                System.out.println("Yellow");
                break;
            case GREEN:
                System.out.println("Green");
                break;
            default:
                break;
        }
    }
}
枚舉類命名規範

《阿里巴巴 Java 開發手冊》對枚舉類的命名規範建議,以下圖:

enter image description here

擴展枚舉類

咱們能夠自定義一些枚舉類方法,擴展枚舉類的使用,請參考如下代碼:

enum ColorsEnum {
    RED("紅色", 1),
    BLUE("藍色", 2),
    YELLOW("黃色", 3),
    GREEN("綠色", 4);
    ColorsEnum(String name, int index) {
        this.name = name;
        this.index = index;
    }
    private String name;
    private int index;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
}
class EnumTest {
    public static void main(String[] args) {
        System.out.println(ColorsEnum.RED.getName());
        System.out.println(ColorsEnum.RED.getIndex());
    }
}

執行以上代碼返回的結果:

紅色
1
相關文章
相關標籤/搜索