內部類顧名思義就是定義在一個類的內部
內部類又有普通內部類、方法和域內的內部類、匿名內部類、嵌套內部類
普通內部類的基礎用法
1 class MyClass{ 2 class InnerClass1{ 3 public InnerClass1() { 4 System.out.println("InnerClass1 created.."); 5 } 6 } 7 class InnerClass2{ 8 public InnerClass2() { 9 System.out.println("InnerClass2 created.."); 10 } 11 } 12 void getInnerClass() { 13 new InnerClass1(); 14 new InnerClass2(); 15 } 16 public static void main(String[] args) { 17 new MyClass().getInnerClass(); 18 } 19 }
//輸出:
InnerClass1 created..
InnerClass2 created..
上圖就是一個普通內部類的例子,同時內部類自動擁有對其外圍類所有成員的訪問權。
main方法中獲得內部類的實例需要借助其他方法,因為main方法是static的。
如果想要直接生成對外部類對象和內部類對象的引用,就需要借助.this和.new關鍵字。
.this關鍵字
1 class MyClass{ 2 class InnerClass{ 3 public InnerClass() { 4 System.out.println("InnerClass created.."); 5 } 6 MyClass getMyClass() { 7 System.out.println("getMyClass.."); 8 return MyClass.this; 9 } 10 } 11 12 InnerClass getInner() { 13 return new InnerClass(); 14 } 15 public static void main(String[] args) { 16 MyClass mc=new MyClass(); 17 MyClass.InnerClass mic=mc.getInner(); 18 MyClass mc2=mic.getMyClass(); 19 } 20 }
上例代碼第8行,內部類通過.this關鍵字返回了一個MyClass對象。
.new關鍵字
上述普通內部類的第一個例子,我們得到一個內部類的對象是通過一個void方法。如果想要在main方法中直接獲得實例可用
MyClass.InnerClass mic=new MyClass().new InnerClass();
內部類向上轉型
內部類向上轉型為一個接口時,內部類可以很好的隱藏起來。
1 interface MyInterface{ 2 int getValue(); 3 } 4 class MyClass{ 5 private class InnerClass implements MyInterface{ 6 public int getValue() { 7 return 1024; 8 } 9 } 10 public MyInterface getInn() { 11 return new InnerClass();//內部類向上轉型為接口 12 } 13 public static void main(String[] args) { 14 MyClass mClass=new MyClass(); 15 System.out.println(mClass.getInn().getValue()); 16 } 17 }