本文详解如何在 Java 中正确实例化静态嵌套类(static nested class),重点解决:在 Exercise 类中直接创建 A.C 实例并调用 foo() 方法,需先构造其依赖的静态内部类 A.B。
本文详解如何在 java 中正确实例化静态嵌套类(static nested class),重点解决:在 `exercise` 类中直接创建 `a.c` 实例并调用 `foo()` 方法,需先构造其依赖的静态内部类 `a.b`。
在 Java 中,static 修饰的嵌套类(如 A.B 和 A.C)属于静态嵌套类(static nested classes),而非内部类(inner classes)。它们不持有对外部类实例的隐式引用,因此可独立于 A 的实例直接实例化——但前提是遵循其构造逻辑。
观察题中定义:
class A {
static class B {} // 无参、默认构造器
static class C {
B b;
C(B b) { this.b = b; } // 构造器明确要求 B 类型参数
int foo() { return 42; }
}
}可见 C 的构造器强制接收一个 B 实例,而 B 本身是 static 类且无显式构造器,因此具备默认无参构造器 new A.B()。
✅ 正确做法是:先创建 A.B 实例,再将其传入 A.C 构造器。可在 assert 表达式中链式完成:
立即学习“Java免费学习笔记(深入)”;
public class Exercise {
public static void main(String[] args) {
assert new A.C(new A.B()).foo() == 42;
}
}该写法等价于分步形式(更易调试和理解):
A.B b = new A.B(); A.C c = new A.C(b); assert c.foo() == 42;
⚠️ 常见错误辨析:
- ❌ A.C(new B()):未加限定名,B 在当前作用域不可见(B 是 A 的静态成员,必须通过 A.B 访问);
- ❌ new A().new C(...):C 是 static 类,不支持通过外部类实例创建(new A().new C() 语法仅适用于非静态内部类);
- ❌ new A.C():编译失败,因 C 无默认构造器,必须提供 B 参数。
? 小结:静态嵌套类本质是“寄居于外层类命名空间中的顶级类”,使用时需以 OuterClass.NestedClass 形式引用,并严格满足其构造契约。本例凸显了静态嵌套类解耦性与构造依赖并存的设计特点。


















