内部类概述
内部类(Inner Class)是定义在另一个类内部的类,可以访问外部类的所有成员,包括私有成员。
成员内部类
public class Outer {
private String outerVar = "外部变量";
public class Inner {
private String innerVar = "内部变量";
public void show() {
System.out.println(outerVar);
System.out.println(innerVar);
}
}
public Inner getInner() {
return new Inner();
}
}
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.show();
静态内部类
public class Outer {
private static String staticVar = "静态变量";
public static class StaticInner {
public void show() {
System.out.println(staticVar);
}
}
}
Outer.StaticInner si = new Outer.StaticInner();
si.show();
局部内部类
public class Outer {
public Object createCalculator() {
final int base = 10;
class Calculator implements Runnable {
public int add(int a, int b) {
return a + b + base;
}
public void run() {
System.out.println("Calculator running");
}
}
return new Calculator();
}
}
匿名内部类
public class AnonymousDemo {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
System.out.println("匿名内部类运行");
}
};
r.run();
Thread t = new Thread(new Runnable() {
public void run() {
System.out.println("线程中使用匿名内部类");
}
});
t.start();
}
}
内部类分类对比
| 类型 | 修饰符 | 访问外部成员 | 创建方式 |
|---|---|---|---|
| 成员内部类 | 无/static | 全部 | outer.new Inner() |
| 静态内部类 | static | 仅静态 | new Outer.Inner() |
| 局部内部类 | 无 | 全部 | 方法内new |
| 匿名内部类 | 无 | 全部 | new Xxx(){} |
小结
- 内部类可以访问外部类的所有成员
- 成员内部类依赖于外部类实例
- 静态内部类不依赖外部类实例
- 匿名内部类没有名字,用于简化代码