1. 創建內部類
創建內部類的方式就是把類的定義置於外圍類的裏面,例如:
class Test1 { class Test2 { private int i = 1; public void value() { System.out.println(i); } } public void f() { Test2 t = new Test2(); t.value(); } } public class Main { public static void main(String[] args) { Test1 t = new Test1(); t.f(); } }
更典型的情況是外部類將有一個方法,返回一個指向內部類的引用,例如:
class Test1 { class Test2 { private int i = 1; public void value() { System.out.println(i); } } public Test2 f() { return new Test2(); } } public class Main { public static void main(String[] args) { Test1 t1 = new Test1(); Test1.Test2 t2 = t1.f(); t2.value(); } }
2. .this與.new
如果需要生成對外部類對象的引用,可以使用外部類的名字後緊跟.this,這樣產生的引用自動地具有正確的類型,例如:
class Test1 { class Test2 { public Test1 outer() { return Test1.this; } } public Test2 inner() { return new Test2(); } public void f() { System.out.println("Hello World!"); } } public class Main { public static void main(String[] args) { Test1 t1 = new Test1(); Test1.Test2 t2 = t1.inner(); t2.outer().f(); } }
有時可能想要告知某些其他對象去創建其某個內部類的對象,必須在new表達式中提供對其他外部類對象的引用,這時需要.new,例如:
class Test1 { class Test2 { public void f() { System.out.println("Hello World!"); } } } public class Main { public static void main(String[] args) { Test1 t1 = new Test1(); Test1.Test2 t2 = t1.new Test2(); t2.f(); } }
在擁有外部類之前是不能創建內部類對象的,但是如果創建的是嵌套類(靜態內部類),那麼它就不需要對外部類對象的引用,例如:
class Test1 { static class Test2 { public void f() { System.out.println("Hello World!"); } } } public class Main { public static void main(String[] args) { Test1.Test2 t = new Test1.Test2(); t.f(); } }
3. 局部內部類
在方法的作用域內創建一個完整的類,這被稱作局部內部類,它在方法之外是不能訪問的,例如:
class Test1 { void f() { System.out.println("Hello World"); } } class Test2 { void inner() { class Test3 extends Test1 {} Test3 t = new Test3(); t.f(); } } public class Main { public static void main(String[] args) { Test2 t = new Test2(); t.inner(); } }
4. 匿名內部類
匿名內部類沒有名字,不能直接引用它,只能在創建時作爲new的一部分來聲明。要使用匿名內部類,必須繼承一個父類或實現一個接口,例如:
abstract class Test1 { abstract void f(); } class Test2 { public Test1 inner() { return new Test1() { public void f() { System.out.println("Hello World"); } }; } } public class Main { public static void main(String[] args) { Test2 t2 = new Test2(); Test1 t1 = t2.inner(); t1.f(); } }