66. Java 嵌套类
在 Java 中,嵌套类是指在另一个类内部定义的类,根据是否使用 static 修饰符,嵌套类可分为:
- 非静态嵌套类(内部类,Inner Class)
- 静态嵌套类(Static Nested Class)
定义方式如下:
class OuterClass {
// 非静态嵌套类(内部类)
class InnerClass {
// 内部类内容
}
// 静态嵌套类
static class StaticNestedClass {
// 静态嵌套类内容
}
}
1. 非静态嵌套类(内部类)
与外部类的关系:
- 内部类与外部类实例相关联,可以直接访问外部类的所有成员,包括私有成员。
创建内部类实例:
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
访问修饰符:
- 内部类可被声明为
private、public、protected或包级私有(无修饰符),与其他类成员一致。
用途:
- 当内部类仅对外部类有意义,或需要访问外部类实例的非静态成员时,使用内部类可实现更紧密的封装和逻辑关联。
示例:
public class OuterClass {
private String outerField = "外部类字段";
// 内部类
class InnerClass {
void display() {
System.out.println("访问:" + outerField);
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.display(); // 输出:访问:外部类字段
}
}
在上述示例中,InnerClass 作为 OuterClass 的内部类,直接访问了外部类的私有字段 outerField。
2. 静态嵌套类(Static Nested Class)
与外部类的关系:
- 静态嵌套类与外部类本身关联,不依赖外部类实例;不能直接访问外部类的实例成员,若需访问,必须通过外部类对象引用。
创建静态嵌套类实例:
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass();
访问修饰符:
- 静态嵌套类可声明为
private、public、protected或包级私有。
用途:
- 当嵌套类不需访问外部类实例成员,但在概念或逻辑上与外部类紧密相关时,使用静态嵌套类可简化包结构,保持封装性。
示例:
public class OuterClass {
private static String staticOuterField = "外部类静态字段";
// 静态嵌套类
static class StaticNestedClass {
void display() {
System.out.println("访问:" + staticOuterField);
}
}
public static void main(String[] args) {
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass();
nestedObj.display(); // 输出:访问:外部类静态字段
}
}
在此示例中,StaticNestedClass 作为静态嵌套类,访问了外部类的静态字段 staticOuterField。
3. 使用嵌套类的优势
- 逻辑分组: 将仅在外部类内部使用且与外部类高度相关的类嵌套在外部类中,使代码结构更紧凑、清晰,减少包中不必要的顶级类。
- 增强封装性:
- 如果一个辅助类需要访问另一个类的私有成员,将其作为内部类可获得访问权限,同时对外保持隐藏,减少外部依赖。
- 静态嵌套类也可隐藏在外部类中,起到“包装内部实现”的作用,使外部只需关注外部类,而无需了解辅助类。
- 便于维护: 代码更接近使用它的地方,对于小型类或仅有辅助功能的类,直接在外部类内部声明可使阅读和维护更加容易。
4. 总结
- 内部类(非静态嵌套类): 依赖外部类实例,可以访问外部类的所有成员。对象创建需要外部类对象。
- 静态嵌套类: 不依赖外部类实例,不能直接访问外部类的实例成员。
- 嵌套类可使用访问修饰符(
private、public、protected、包级私有)来控制可见性。 - 使用嵌套类能够逻辑分组仅在外部类内部使用的类、增强封装性以及改善代码可读性。
这使得嵌套类在组织紧密相关的类或隐藏实现细节时非常有用。