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