Java 不应允许内部类中存在静态方法,但此代码仍可编译并运行。这怎么可能?
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();
}
}
假设您的导师不是最新的(?)Java 版本。
事实上,在 Java 16 之前,内部类中不可能有
static
方法,但在那个 Java 版本中,这是允许的。
请参阅为什么 Java 16 中的非静态内部类中允许使用静态方法?了解更多信息。
在我撰写本文时(2024 年 10 月 12 日),当前的 Java 版本是 Java 23。
对于 Java 15 及更早版本,您的导师是正确的。然而,Java 16 中的规则发生了变化:JEP 395:记录:
此 JEP 建议最终确定 JDK 16 中的该功能,其中 以下细化:
- 放宽内部类不能声明显式或隐式静态成员的长期限制。这将 变得合法,特别是允许内部类声明 是创纪录级别的成员。
顺便说一句,形式上,类
Inner
实际上称为local嵌套类,因为它是方法的本地类,它是否是内部类取决于它是在静态方法还是非静态方法中。