内部类
内部类(Inner Class)是定义在另一个类内部的类。Java 允许在一个类的内部定义另一个类,这样的类称为内部类,包含内部类的类称为外部类。
特点
- 封装性:内部类可以访问外部类的所有成员,包括私有成员
- 逻辑相关性:内部类通常只被外部类使用,体现了良好的封装性
- 多重继承效果:内部类可以实现 Java 的多重继承效果
- 代码组织:可以将存在一定逻辑关系的类组织在一起
用法示例
java
public class OuterClass {
private String outerField = "外部类字段";
private static String staticOuterField = "外部类静态字段";
// 成员内部类
class InnerClass {
private String innerField = "内部类字段";
public void display() {
// 可以直接访问外部类的所有成员
System.out.println("访问外部类字段: " + outerField);
System.out.println("访问外部类静态字段: " + staticOuterField);
}
}
public void testInnerClass() {
// 在外部类中创建内部类实例
InnerClass inner = new InnerClass();
inner.display();
}
public static void main(String[] args) {
// 在其他类中创建内部类实例
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.display();
}
}内部类的分类
Java 中的内部类主要分为以下几种:
- 成员内部类:位于外部类成员位置的非静态类
- 静态内部类:使用 static 修饰的内部类
- 局部内部类:定义在方法或作用域内的内部类
- 匿名内部类:没有名字的内部类,通常用于实现接口或继承类
静态内部类
静态内部类是使用 static 关键字修饰的内部类。它不依赖于外部类的实例,可以直接通过外部类名访问。
特点
- 独立性:静态内部类不持有对外部类实例的引用
- 访问限制:只能直接访问外部类的静态成员
- 实例化:无需外部类实例即可创建对象
- 内存效率:相比非静态内部类更节省内存
用法示例
``java public class OuterClass { private static String staticField = "外部类静态字段"; private String instanceField = "外部类实例字段";
// 静态内部类
static class StaticNestedClass {
public void display() {
// 可以直接访问外部类的静态成员
System.out.println("访问静态字段: " + staticField);
// 不能直接访问外部类的实例成员
// System.out.println(instanceField); // 编译错误
// 如果需要访问实例成员,必须通过实例引用
OuterClass outer = new OuterClass();
System.out.println("通过实例访问: " + outer.instanceField);
}
}
public static void main(String[] args) {
// 创建静态内部类实例的方式
OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
nested.display();
}
}
### 使用场景
1. **工具类**:当内部类不需要访问外部类的实例变量时
2. **单例模式**:静态内部类实现线程安全的单例模式
3. **组织代码**:将相关的辅助类组织在一起,提高代码可读性
## 局部内部类
鸡肋语法,了解即可