提问人:Rishi Bharadwaj 提问时间:7/23/2023 更新时间:7/24/2023 访问量:102
内部类可以在 java 17 中包含静态成员吗?[复制]
Inner classes can have the static members inside it in java 17? [duplicate]
问:
我正在阅读有关内部类的文章,出于好奇,我宣布了内部类中的静态成员。奇怪的是,没有显示编译时错误,代码执行良好。
我回顾了预言机文档,仍然可以找到以下语句:“因为内部类与实例相关联,所以它本身不能定义任何静态成员。
我真的很困惑,如果对内部类进行了增强,那么在更高版本的 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!!!!");
}
}
}
答:
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 中完成该功能,并进行以下改进:
放宽长期存在的限制,即内部类不能声明显式或隐式静态的成员。这将变得合法,特别是,将允许内部类声明作为记录类的成员。
评论