Appearance
2026-08-27 · 类可以定义在类的内部。工作中真正用的只有两种:匿名内部类(Lambda 的前身)和静态内部类(组织代码用)。
Java 内部类
1. 匿名内部类
没有名字的内部类,一次性使用——省掉单独写一个实现类:
java
// 定义接口
public interface Swimmable {
void swim();
}
// 传统方式:写一个实现类
public class Duck implements Swimmable {
@Override
public void swim() {
System.out.println("鸭子在游泳");
}
}
Duck duck = new Duck();
duck.swim();
// 匿名内部类:省掉实现类,直接写方法体
Swimmable s = new Swimmable() {
@Override
public void swim() {
System.out.println("鸭子在游泳(匿名)");
}
};
s.swim();匿名内部类的本质:同时完成"创建实现类"和"创建对象"两步。
匿名内部类的使用场景
java
// 场景1:线程(Runnable)
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程运行中");
}
}).start();
// 场景2:集合排序
List<String> list = Arrays.asList("c", "a", "b");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});匿名内部类 → Lambda(Java 8+)
Lambda 是匿名内部类的简写,只适用于函数式接口(只有一个抽象方法的接口):
java
// 匿名内部类
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("运行中");
}
};
// Lambda 简写
Runnable r2 = () -> System.out.println("运行中");
// 匿名内部类
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
// Lambda 简写
Collections.sort(list, (a, b) -> a.compareTo(b));Lambda 语法:(参数) -> { 方法体 }
- 参数类型可以省略
- 单行方法体可以省略
{}和return - 单个参数可以省略
()
匿名内部类在旧代码里常见,新代码都用 Lambda 或方法引用(见《Java 函数式编程》)。
2. 静态内部类
用 static 修饰的内部类,不需要外部类对象就能创建:
java
public class Outer {
private static String school = "北京大学";
public static class StaticInner {
public void show() {
System.out.println("学校:" + school); // ✅ 能访问外部类的静态成员
// System.out.println(name); // ❌ 不能访问非静态成员
}
}
}
// 创建静态内部类对象(不需要外部类对象)
Outer.StaticInner inner = new Outer.StaticInner();
inner.show(); // 学校:北京大学什么时候用:一个类只服务于另一个类,且不想单独占一个文件时——比如 Map.Entry、Builder 模式里的 Builder 类、DTO 的嵌套结构。
成员内部类(
outer.new Inner())和局部内部类(定义在方法里)工作中基本不用,已被 Lambda 和静态内部类取代,不做展开。