1. 内部类
在Java中有一种类,被定义在一个类的内部,它被称为内部类(Nested Class)。Java中常见的内部类有三种,Inner Class
,Anonymous Class
,Static Nested Class
。
2. Inner Class
有如下代码
public class Main {
public static void main(String[] args) {
Outer outer = new Outer("Nested"); // 实例化一个Outer
Outer.Inner inner = outer.new Inner(); // 实例化一个Inner
inner.hello();
}
}
class Outer {
private String name;
Outer(String name) {
this.name = name;
}
class Inner {
void hello() {
System.out.println("Hello, " + Outer.this.name);
}
}
}
-
其中
Inner
类为Outer
的内部类,这样的类不能独立于Outer
存在,必须由Outer
的实例来创建Inner
的实例。 -
Inner
类可以读写Outer
类的private方法和字段。
3. Anonymous Class
Anonymous Class称为匿名类,这种类通常不需要名字,例如:
public class Main {
public static void main(String[] args) {
Runnable r = new Runnable() {
@override
public void run() {
System.out.println("Thread run");
}
}
new Thread(r).start();
}
}
其中Runnable
是一个接口,不能使用new
来使其实例化,在这儿使用{}
定义了一个内部类,该类实现(implement)了Runnable
接口,所以Runable
就可以引用该匿名类的实例。
4. Static Nested Class
与Inner Class
类似,唯一不同的是在类的内部定义的是一个静态类,和外部类互相独立,不必像Inner Class
那样需要借助Outer
的实例进行创建。
public class Main {
public static void main(String[] args) {
Outer.Inner inner = Outer.Inner(); // 实例化一个Inner
inner.hello();
}
}
class Outer {
private String name;
Outer(String name) {
this.name = name;
}
static class Inner {
void hello() {
System.out.println("Hello, " + Outer.this.name);
}
}
}
但与Inner Class
相同,可以访问外部类带有private的静态方法和字段。