为何Java允许内部类中定义静态方法?代码可编译运行原因解析
为什么方法内的局部内部类能定义静态方法?
你印象里“Java内部类不能定义静态方法”的规则,其实只针对成员内部类——也就是直接嵌套在外部类中、和成员方法/变量同级的内部类。这类内部类默认会持有外部类实例的引用,所以在Java 16之前确实不允许定义静态方法。
但你代码里的Inner是方法局部内部类:它定义在外部类的方法m1()内部,属于方法作用域内的类。Java 16及之后的版本放宽了对这类内部类的限制,允许局部内部类包含静态方法和静态成员,只要满足两个核心条件:
- 静态元素不会引用外部的非静态变量/方法(避免依赖外部类实例)
- 静态元素本身符合Java静态成员的规则(比如不违反访问权限、类型合法等)
你的代码完全符合要求:m2()是静态方法,它引用的j是外部类的静态变量,没有依赖任何外部类实例,所以能正常编译运行,最终输出20。
class Test{ static int j=20; public void m1() { class Inner{ public static void m2() { System.out.println(j); } } Inner inner = new Inner(); inner.m2(); } public static void main(String[] args) { Test obj = new Test(); obj.m1(); } }
内容的提问来源于stack exchange,提问作者abhay chanana
相关产品推荐
相关产品推荐

