示例
内部类(Non-static Inner Class):
public class OuterClass {
private String outerField = "我是外部类字段";
class InnerClass {
public void display() {
System.out.println(outerField); // 可以直接访问外部类的成员
}
}
public void showInnerClass() {
InnerClass inner = new InnerClass(); // 实例化内部类
inner.display();
}
}
public class Test {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.showInnerClass(); // 外部类方法调用内部类
}
}
静态内部类(Static Inner Class):
public class OuterClass {
private static String outerField = "我是外部类静态字段";
static class StaticInnerClass {
public void display() {
System.out.println(outerField); // 可以直接访问外部类的静态成员
}
}
public static void showStaticInnerClass() {
StaticInnerClass inner = new StaticInnerClass(); // 不需要外部类实例即可实例化
inner.display();
}
}
public class Test {
public static void main(String[] args) {
OuterClass.showStaticInnerClass(); // 直接通过外部类调用静态内部类的方法
}
}
区别说明
1. 实例化
- 内部类:需要依赖外部类的实例来创建实例。即内部类的实例与外部类的实例是绑定的,每一个内部类实例都隐式地持有一个外部类实例的引用。
- 静态内部类:不需要外部类的实例即可创建实例,因为它属于类层级(而非实例层级),所以它可以直接通过外部类名来访问(如果它是
public
或protected
/default
访问级别,并且在相同的包中或子类中)。
2. 访问权限
- 内部类:可以直接访问外部类的所有成员(包括私有成员),因为它持有一个外部类实例的引用。
- 静态内部类:只能直接访问外部类的静态成员。如果需要访问非静态成员,则必须通过外部类的实例。
3. 用途
- 内部类:常用于实现回调接口(如事件监听器)、定义辅助类以及实现多继承的效果(Java不直接支持多继承,但可以通过内部类实现)。
- 静态内部类:常用于作为工具类或者当内部类与外部类逻辑上较为独立时使用。它提供了一种将代码组织在一起的方式,但又保持了类的独立性和可重用性。
结语
特性 | 内部类 (Non-static Inner Class) | 静态内部类 (Static Inner Class) |
---|---|---|
实例化 | 需要外部类的实例 | 不需要外部类的实例 |
访问外部类成员 | 可以访问所有成员(包括私有) | 只能访问静态成员 |
持有外部类引用 | 是 | 否 |
用途 | 实现回调、辅助类、多继承模拟 | 组织代码、工具类、逻辑独立 |