內部類不只常常出如今各類面試題中,還會在 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(); } }
在一個類中定義了另外一個 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(); } }
沒有名字的內部類就叫作匿名內部類。
匿名內部類的使用示例以下:
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 開發手冊》對枚舉類的命名規範建議,以下圖:
咱們能夠自定義一些枚舉類方法,擴展枚舉類的使用,請參考如下代碼:
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