Java枚举类型中protected变量的作用是什么?(附Java 9代码示例)
解析Java枚举中protected成员的作用
先来看你给出的枚举代码:
enum Abc { A, B, C; static protected int foo = 4; // 此类枚举中的protected变量有何作用? }
你觉得这个protected修饰符毫无意义,核心原因是Java枚举默认是final类,无法被继承或实现——这个认知是对的,但protected成员的作用其实不止“被子类继承访问”这一点,咱们具体来说:
1. 符合Java语法的一致性规则
Java的访问修饰符(public/protected/private/default)是一套通用的类成员规则,不管当前类是不是final类,语法上都允许定义protected成员。编译器不会因为类是final就禁用这个修饰符,这是为了保持语言规则的统一性,避免给开发者增加额外的学习成本——不用专门记“final类不能用protected”这种例外。
2. 同一个包下的类可以访问
protected的本来含义就包含“同一个包内可见”,哪怕枚举是final类,只要其他类和它在同一个包下,就能直接访问这个protected成员。比如:
// 和Abc枚举同包的类 public class TestEnum { public static void main(String[] args) { System.out.println(Abc.foo); // 可以正常访问,输出4 } }
3. 枚举内部的嵌套类可访问
如果枚举内部定义了嵌套类(不管是静态还是非静态),嵌套类都能访问外部枚举的protected成员。比如:
enum Abc { A, B, C; static protected int foo = 4; // 枚举内部的非静态嵌套类 class NestedClass { void printFoo() { System.out.println(foo); // 直接访问protected成员 } } }
4. 和final类的protected成员逻辑完全一致
你补充提到这个问题和“为什么Java final类允许包含protected成员?”本质相同,确实如此。final类里的protected成员,虽然失去了“被子类继承访问”的场景,但依然保留了“包内可见”和“内部嵌套类可见”的作用,枚举作为特殊的final类,自然也遵循这个逻辑。
总结一下:枚举里的protected成员并非毫无意义,它依然能在同包类和枚举内部嵌套类中发挥作用,同时也是Java语法规则一致性的体现。
内容的提问来源于stack exchange,提问作者1 JustOnly 1
相关产品推荐
相关产品推荐

