记录一个神奇的问题,Java成员内部类能否拥有静态属性(方法)?

150 阅读2分钟

起因

本着学新不学旧的原则,本人学习Java的过程中使用的都是JDK17的版本(当然也装有JDK8)。在今天(2022.12.17)进一步了解单例设计模式的时候突发奇想,能否将“通过静态内部类创建懒汉式单例对象”通过成员内部类实现,于是我便去搜索了相关资料,突然发现一个问题:非静态内部类无法拥有静态属性(方法)??(黑人问号.jpg)。WTF,那还玩个der。但是我又觉着不对劲(我有普通内部类可以拥有静态属性(方法)的印象),难道我觉着错了,于是乎本着实践出真知的原则,我自己试了下,咦,可以做到通过成员内部类设置相似的方式来获取单例对象?那为什么网上这么多写“成员内部类不能拥有静态属性(方法)的文章”?于是我就去搜了搜...。寄,没直接搜到(可能有点隐蔽,或者我搜索方式有点不对,反正就是没有很容易的找到)。于是我换了个思路,找了下近半年的关于内部类的文章。终于找到了一丝线索:“JDK16”前,成员内部类无法拥有静态属性(方法)。于是我又去找了下(没错,又没直接找到相关文章,不过我猜到了,所以我直接去Oracle官网找了 呲牙.jpg)

经过

寄,又没找到,因为英文看不懂(doge)。哈哈哈,开个玩笑。
JEP395:Records中提到了关于放松非静态内部类显示/隐式声明静态成员的限制。 我知道你懒得找,所以可以直接看下面的截图:

Snipaste_2022-12-17_16-20-36.jpg

第一句大概意思: 放宽之前内部类不能声明显式或隐式静态成员的限制。
第二句: 那(可以声明静态成员这件事)将变得合法,特别是,将允许内部类声明一个record类型成员。

结果

结果显而易见(doge),JDK16之后可以在非静态内部类中声明静态成员了。(狗咬玫瑰.jpg) 但是话说回来,这个知识也就是个“奇怪的知识又增加了”这种类型的。实际用到的概率很低,而且在IDEA中会有如下提示:

image.png 好了,就这些,第一次写文章,如有错误之处请包涵。多多指教。(捧心.jpg)

参考:
[1]我机智的小脑筋
[2]搜索引擎
[3]oracle官网