[Java] (为什么我可以)在非静态内部类中声明静态方法/静态字段?

最近在学习Java,在书《Java核心技术 卷I》第12版P271中有一个注释

内部类声明的所有静态字段都必须是final,并初始化为一个编译时常量。如果这个字段不是一个常量,就可能不唯一。
内部类不能有static方法。Java语言规范对这个限制没有做任何限制。按理说,也可以有只能访问外围类静态字段和方法的静态方法。但显然,Java设计者认为相对于复杂性来说,它带来的好处有些得不偿失。

对于这段话,我在Java17下进行了测试,在非静态内部类中声明了静态方法,并且正常调用,没有报错乃至警告

public class OuterClass {

    class InnerClass {
        static void printMe() {
            System.out.println("Inside inner class");
        }
    }
    
    public static void main(String[] args) {
        InnerClass.printMe();
    }
   
}

使用中文找了十几分钟都没找到原因。。搜索结果都是说不可以在内部类声明静态方法。不得不说中文网络在这方面还是差的多,我用英文第一个就是答案。


以下链接是原答案:

【Stack Overflow】Why are static methods allowed inside a non-static inner class in Java 16?

下面我简要概括一下:
根据JEP-395Java16正式引入了Record,为了在内部类中声明Record,放松了在内部类中声明静态成员的限制,并且开发人员进一步的取消了所有的限制。

Static members of inner classes
It is currently specified to be a compile-time error if an inner class declares a member that is explicitly or implicitly static, unless the member is a constant variable. This means that, for example, an inner class cannot declare a record class member, since nested record classes are implicitly static.
We relax this restriction in order to allow an inner class to declare members that are either explicitly or implicitly static. In particular, this allows an inner class to declare a static member that is a record class.
内部类的静态成员
目前规定,如果内部类显性或隐性声明了一个静态成员,则是一个编译时错误,除非该成员是一个常量变量。这意味着内部类不能声明一个Record成员,因为嵌套的Record类是隐式静态的。
我们放宽了这个限制,以允许内部类声明显性或隐性的静态成员。特别指出的是,这允许内部类声明一个Record类的静态成员。

综上,在Java16之后可以在内部类中声明静态成员。

对于为什么一开始会有这个限制,有兴趣的可以自行查看下面这个链接:
【Stack Overflow】Why does Java prohibit static fields in inner classes?

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值