Skip to content

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 和静态内部类取代,不做展开。