亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

Java 内部类深度解析:分类、语法与实战应用

内部类是定义在另一个类内部的类,外部类称为外部类。内部类提供了更好的封装,可访问外部类私有成员,是实现回调、迭代器等模式的基础。

嵌套分类

嵌套类
├── 静态嵌套类    // static 修饰
└── 非静态嵌套类 (内部类)
    ├── 成员内部类      // 类成员位置
    ├── 局部内部类      // 方法/代码块内
    └── 匿名内部类      // 无类名,声明即实例化

成员内部类

可用任意访问修饰符(包括 private),可直接访问外部类所有成员(含私有)。

创建与访问

public class Outer {
    private int num = 100;
    
    private class Inner {
        void print() { System.out.println("内部类访问外部私有: " + num); }
    }
    
    public void accessInner() {
        Inner in = new Inner(); // 外部类内部直接 new
        in.print();
    }
}

// 外部类外部创建内部类实例
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 语法:外部实例.new 内部类()

访问外部类私有成员

public class Outer {
    private int data = 42;
    public class Inner {
        public int getData() { return data; } // 直接访问外部私有字段
    }
}

Outer.Inner inner = new Outer().new Inner();
System.out.println(inner.getData()); // 42

局部内部类

定义在方法/代码块内,作用域限于该块。可访问外部类成员及最终局部变量(Java 8+ 隐式 final)。

public void method() {
    final int local = 10; // Java 8+ 可省略 final
    class LocalInner {
        void show() { System.out.println(local); }
    }
    new LocalInner().show(); // 必须在方法内实例化
}

匿名内部类

无类名,继承类或实现接口并现场重写方法,常用于事件监听、线程创建、比较器等场景。

语法

new SuperType/Interface() {
    // 重写方法或实现抽象方法
    @Override public void method() { ... }
};

实现接口示例

interface Greeting { void sayHello(); }

Greeting g = new Greeting() {
    @Override public void sayHello() { System.out.println("匿名内部类问候"); }
};
g.sayHello();

作为方法参数传递

interface Callback { void execute(); }

void doWork(Callback cb) { cb.execute(); }

// 调用时传入匿名类
doWork(new Callback() {
    @Override public void execute() { System.out.println("执行回调"); }
});

静态嵌套类

用 static 修饰,属于外部类静态成员。无外部类实例引用,只能访问外部类静态成员。实例化无需外部类实例:

public class Outer {
    static class Nested { void hello() { System.out.println("静态嵌套类"); } }
}

Outer.Nested n = new Outer.Nested(); // 直接实例化
n.hello();

内部类 vs 静态嵌套类对比

特性内部类静态嵌套类
访问外部实例成员✅ 直接访问❌ 不可访问
需外部实例创建✅ 是❌ 否
可定义静态成员❌ 否 (Java 16+ 允许)✅ 是
典型用途迭代器、回调、封装实现细节工具类、Builder 模式、数据持有

实战建议

  1. 需访问外部实例状态 → 成员内部类
  2. 仅方法内使用、逻辑简单 → 局部/匿名内部类
  3. 无需外部实例、作为工具或数据载体 → 静态嵌套类
  4. 匿名类体积大或复用多处 → 改为具名内部类或顶层类
  5. Java 16+ 可在内部类定义 static 成员,但仍需外部实例访问实例字段

java

  1. 深入理解 Java final 关键字:变量、方法与类的不可变性
  2. Java instanceof 运算符完全指南:用法、继承与接口检查
  3. 精通 Java 嵌套类与内部类:类型、示例与最佳实践
  4. 深入理解 Java 静态嵌套类:用法、差异与实战示例
  5. 精通 Java 匿名内部类:定义、语法与实战示例
  6. Java 单例模式详解:安全实现与使用指南
  7. 精通 Java 反射:运行时检查类、方法与字段
  8. 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
  9. 掌握 Java 泛型:构建可复用、类型安全的代码
  10. 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除
  11. 精通 Java:理解对象、类与核心 OOP 概念
  12. Java 9 菱形操作符扩展:匿名内部类也能用 <> 推断