默认情况下,枚举中变量的访问级别是多少?
这个问题在这里已经有了答案:
enum中手动声明字段的隐式访问级别是package-private ,与普通类中的完全相同。 因此,只有当Animals
和TestEnum
在同一个包中时,您的sound
场才可以访问。
我试图在JLS中为此找到一个坚实的引用,但不幸的是,枚举规则分散在整个地方,规定为正常类的规则的例外,因此必须从片断中组合规则。 JLS§6.6.1确定可访问性说:
只有类型可访问且成员或构造函数声明为允许访问时,才可以访问引用类型的成员(类,接口,字段或方法)或类类型的构造方法:
如果成员或构造函数被声明为public
,则允许访问。
所有缺乏访问修饰符的接口成员都是隐式public
。
否则,如果成员或构造函数被声明为protected
,则只有在满足以下条件之一时才允许访问:
成员或构造函数的访问发生在包含声明protected
成员或构造函数的类的包中。
访问权限是正确的,如第6.6.2节所述。
否则,如果用包访问声明成员或构造函数,则只有在声明类型的包内进行访问时才允许访问。
没有访问修饰符声明的类成员或构造函数隐式具有包访问权限。
否则,成员或构造函数被声明为private,并且只有当它出现在包含成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问。
这意味着类类型( class
和enum
)获得成员隐式拥有程序包访问权的规则,而接口类型( interface
和@interface
)则获得成员隐式公开的规则。
从上面的情况来看,“集体成员”在“阶级”的定义中包含了枚举,但并不明显。 由于它们有广泛的重叠,JLS组在许多地方用类来枚举(并且注解类型也被同样分组为接口)。 JLS§8.9枚举类型说“枚举声明指定一个新的枚举类型,一种特殊的类类型”; 和JLS§8.2类成员明确表示“类成员”一词是指“类类型”的成员。
但是,枚举在成员可访问性方面确实有两个特殊规则,这些规则并未包含在上面引用的部分中:
枚举常量本身(在你的例子中,它们是DOG
, CAT
和FISH
)可能没有任何显式访问修饰符(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