默认情况下,枚举中变量的访问级别是多少?

这个问题在这里已经有了答案:

  • 在Java中,封装私有,公共,受保护和私有26个答案之间的区别

  • enum中手动声明字段的隐式访问级别是package-private ,与普通类中的完全相同。 因此,只有当AnimalsTestEnum在同一个包中时,您的sound场才可以访问。


    我试图在JLS中为此找到一个坚实的引用,但不幸的是,枚举规则分散在整个地方,规定为正常类的规则的例外,因此必须从片断中组合规则。 JLS§6.6.1确定可访问性说:

    只有类型可访问且成员或构造函数声明为允许访问时,才可以访问引用类型的成员(类,接口,字段或方法)或类类型的构造方法:

  • 如果成员或构造函数被声明为public ,则允许访问。

    所有缺乏访问修饰符的接口成员都是隐式public

  • 否则,如果成员或构造函数被声明为protected ,则只有在满足以下条件之一时才允许访问:

  • 成员或构造函数的访问发生在包含声明protected成员或构造函数的类的包中。

  • 访问权限是正确的,如第6.6.2节所述。

  • 否则,如果用包访问声明成员或构造函数,则只有在声明类型的包内进行访问时才允许访问。

    没有访问修饰符声明的类成员或构造函数隐式具有包访问权限。

  • 否则,成员或构造函数被声明为private,并且只有当它出现在包含成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问。

  • 这意味着类类型( classenum )获得成员隐式拥有程序包访问权的规则,而接口类型( interface@interface )则获得成员隐式公开的规则。

    从上面的情况来看,“集体成员”在“阶级”的定义中包含了枚举,但并不明显。 由于它们有广泛的重叠,JLS组在许多地方用类来枚举(并且注解类型也被同样分组为接口)。 JLS§8.9枚举类型说“枚举声明指定一个新的枚举类型,一种特殊的类类型”; 和JLS§8.2类成员明确表示“类成员”一词是指“类类型”的成员。

    但是,枚举在成员可访问性方面确实有两个特殊规则,这些规则并未包含在上面引用的部分中:

  • 枚举常量本身(在你的例子中,它们是DOGCATFISH )可能没有任何显式访问修饰符(JLS§8.9.1),并且始终是枚举类型的public static final字段(JLS§8.9.3) 。

  • 枚举构造函数必须是私有的(以防止人们创建额外的常量)并且是隐式私有的(JLS§8.9.2)。

  • 除了这两个例外,正常类的访问规则适用于枚举。 如果你的Animals枚举是public ,它和它的所有常量都可以在包外部访问,但是sound场是包私有的,并且除非你明确public声明,否则不能在包之外访问。


    如果你可以导入enum你可以访问enum常量

    如果enum可以在package外部访问(特别声明为public ),它的元素也是可访问的,如果没有指定修饰符,它只能在package内部访问。 默认情况下, enum常量是可访问的,如果enum可访问意味着默认情况下它们是public static final

    由于这个a.DOG.sound部分,我希望代码无法编译。 但令我惊讶的是,事实并非如此。

    它将与任何其他变量在任何类中表现为相同,如果没有默认修饰符,它将仅在包内部可访问。

    链接地址: http://www.djcxy.com/p/24057.html

    上一篇: What is the access level of variables in enums by default

    下一篇: Protected vs Public in terms of Inheritance in Java