java - 在 Java 中,为什么可以用另一个枚举常量来限定一个枚举常量?

标签 java enums qualified-name

最近,我注意到,有可能:

class Test {
    public enum Season { WINTER, SPRING, SUMMER, FALL }
    Season field = Season.WINTER.SPRING; // why is WINTER.SPRING possible?
}

这有什么原因吗?

最佳答案

当您在 Java 中访问对象的静态成员(包括枚举)时,编译器会有效地用其静态类型替换该对象。更具体地说,

class ExampleClass {
    static int staticField;
    static void staticMethod() {
        ExampleClass example = new ExampleClass();
        example.staticField;     // Equivalent to ExampleClass.staticField;
        example.staticMethod();  // Equivalent to ExampleClass.staticMethod();
    }
}

同样,由于枚举实际上是“静态的”,Season.WINTER.SPRING 等同于 Season.SPRINGSeason.WINTER 替换为其枚举类型 Season

作为旁注,不鼓励从实例访问静态成员,因为这可能会造成混淆。例如,如果您看到一段包含 someThread.sleep() 的代码,您可能会误以为 someThread 已进入休眠状态。然而,由于 sleep() 是静态的,该代码实际上是在调用 Thread.sleep() 使当前线程 hibernate 。

关于java - 在 Java 中,为什么可以用另一个枚举常量来限定一个枚举常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742178/

相关文章:

c++ - 外线成员函数定义是否需要全局范围内的完全限定类名?

java - 如何在不创建新对象的情况下更改对象的类?

java - 如何使用具有相同值结构的动态键数反序列化列表?

c++ - 成员函数声明中是否允许限定名称?

.net - 如果定义了显式构造函数,dapper 能否处理在数据库中存储为 varchar 的枚举?

javascript - 跨组件强制执行参数值限制

java - 即使我已经安装了jdk,Android Studio也无法识别jvm

java:在一个 webapp 中使用同一个库的两个版本

Python,Enum 类型有什么用?