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(); } }