内部类可以在 java 17 中包含静态成员吗?[复制]

Inner classes can have the static members inside it in java 17? [duplicate]

提问人:Rishi Bharadwaj 提问时间:7/23/2023 更新时间:7/24/2023 访问量:102

问:

我正在阅读有关内部类的文章,出于好奇,我宣布了内部类中的静态成员。奇怪的是,没有显示编译时错误,代码执行良好。

我回顾了预言机文档,仍然可以找到以下语句:“因为内部类与实例相关联,所以它本身不能定义任何静态成员。

我真的很困惑,如果对内部类进行了增强,那么在更高版本的 java 中,我们现在也可以在内部类中声明静态成员?

任何关于这一点的光线都将不胜感激。

以下是您可以尝试使用 Java 17 的代码片段:

class Outer{
     class Inner{
          static int i =10;
          public static void method(){
              System.out.println("The static members can be now declared within Inner classes!!!!");
          }
     }
}
Java 内部类 static-members

评论

0赞 dan1st 7/23/2023
你说的是哪个文件?JLS 指定内部类的静态成员。
0赞 DuncG 7/23/2023
只需阅读有关 JEP395 的信息,还可以查看其他类似的问题
0赞 yshavit 7/24/2023
我有点困惑为什么这会被否决。OP描述了上下文,描述了他们的期望和原因(引用了官方文档,同样如此!),描述了发生的事情,并提供了一个最小但有效的代码片段以及他们的Java版本。这对我来说似乎是一个完美的问题,tbh。反对票不应该是“我选民已经知道这个问题的答案”的简写。
0赞 yshavit 7/24/2023
补充:也许是因为它是重复的?如果是这样,只需将其标记为重复项即可。
0赞 user207421 10/21/2023
也许是因为他没有引用他的“文章”和“文件”?

答:

1赞 MC Emperor 7/23/2023 #1

来自 Oracle 文档:

Java 教程是为 JDK 8 编写的。本页中介绍的示例和做法未利用更高版本中引入的改进,并且可能使用不再可用的技术。

以及放宽静态成员规则的提案,从 openjdk.org

解决方法:已批准。 修复版本:16

所以,是的,内部类允许有静态成员,但 Oracle 文档的编写包含高达 Java 8 的功能。自 Java 16 以来,规则发生了变化。

1赞 WJS 7/24/2023 #2

来自 Java 6 语言规范。

内部类是未显式或隐式声明为静态的嵌套类。内部类不能声明静态初始值设定项 (§8.7) 或成员接口。内部类不能声明静态成员,除非它们是编译时常量字段 (§15.28)。

为了说明这些规则,请考虑以下示例:(摘自 Java 6 LS)

class HasStatic{
    static int j = 100;
}
class Outer{
    class Inner extends HasStatic{
        static final int x = 3;         // ok - compile-time constant
        static int y = 4;           // compile-time error, an inner class
    }
    static class NestedButNotInner{
        static int z = 5;           // ok, not an inner class
    }
    interface NeverInner{}              // interfaces are never inner
}

这在 JEP 395 中得到了放宽,最终确定将 作为该语言的标准功能。声明内容如下:record

此 JEP 建议在 JDK 16 中完成该功能,并进行以下改进:

放宽长期存在的限制,即内部类不能声明显式或隐式静态的成员。这将变得合法,特别是,将允许内部类声明作为记录类的成员。