Java成员内部类支持非final静态成员的运行原因问询
代码与教材表述不一致的核心原因
你遇到的差异本质是Java版本迭代带来的语法规则放宽,具体说明如下:
- 旧版本规则(对应教材表述)
教材里的表述是Java 15及更早版本的强制规范:非静态成员内部类与外部类的实例强绑定,仅允许定义
static final修饰的编译时常量作为静态成员,其余静态字段、静态方法、静态代码块均不允许定义,用JDK15及更低版本编译你提供的代码会直接抛出编译错误。 - 新版本规则调整
Java 16通过JEP 395(记录类特性)同步修改了嵌套类的语法限制,明确允许非静态成员内部类定义任意类型的静态成员,包括普通静态字段、静态方法、静态初始化块等,不再强制要求静态成员必须是
static final常量,你的代码可以正常编译运行,说明你使用的是JDK 16或更高版本的JDK。
你给出的代码运行结果符合Java 16+的语法逻辑:
- 首次调用
SwimmerAssistant.assist()和读取count时没有创建内部类实例,静态变量count初始值为0,输出0 - 两次创建
SwimmerAssistant实例时构造器各执行一次count++,最终count值为2,符合静态变量全局共享的特性。
内容的提问来源于stack exchange,提问作者Gueorgui Balaktchiev
相关产品推荐
相关产品推荐

