gpt4 book ai didi

java - 从什么时候开始枚举构造函数的默认访问修饰符是私有(private)的?

转载 作者:行者123 更新时间:2023-12-05 02:00:04 35 4
gpt4 key购买 nike

枚举构造函数的默认访问修饰符“私有(private)”多久了?从一开始还是它在 Java 8 中发生了变化?如果是,那么没有访问修饰符的构造函数声明的默认访问修饰符是什么? (我猜它是默认的(包可访问),就像其他 Java 类的构造函数一样。)

我找了一些与此相关的引用文档,但没有找到确切的答案。这是我发现的,

  1. Java8 JLS 8.9.2 , 在枚举声明中,没有访问修饰符的构造函数声明是私有(private)的。
  2. Java7 JLS 8.9.2 , 如果枚举类型没有构造函数声明,则自动提供不带参数的私有(private)构造函数(以匹配隐式空参数列表)。

最佳答案

From when enum constructor's default access modifier be "private"?

总是。你不能创建新的枚举,这就是它们的意义所在。你不能有枚举的非私有(private)构造函数(使用来自 openjdk16 的 javac):

> cat Test.java
public enum Test {
FOO, BAR;
public Test() {}
}
> javac Test.java
Test.java:3: error: modifier public not allowed here

让我们试试 java6(是的,我有 javac6,可以在新的 java 上运行)。

> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
Test.java:3: error: modifier public not allowed here

所以,这个错误在 2 年内没有改变。

让我们检查 javac6 中的访问级别!

> cat Test.java
public enum Test {
FOO, BAR;
Test() {}
}
> java -jar javac6.jar -bootclasspath openjdk6-rt.jar Test.java
> javap -c -private Test
.... lots of decompiled bytecode

private Test();
Code:
0: aload_0
1: aload_1
2: iload_2
3: invokespecial #18 // Method java/lang/Enum."<init>":(Ljava/lang/String;I)V
6: return

... more decompiled bytecode

因此,私有(private)。一直是,永远是。这就像在问:“圆有角吗?”。

答案是:没有。从来没有。如果一个圆有一个角,它就不再是一个。具有公共(public)构造函数的枚举不是枚举。

关于java - 从什么时候开始枚举构造函数的默认访问修饰符是私有(private)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67487069/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com