Когда вы обращаетесь к статическому члену объекта (включая перечисления) в 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.SPRING
; Season.WINTER
заменяется типом перечисления Season
.
Как примечание, доступ к статическим элементам из экземпляров не рекомендуется, потому что это может привести к путанице. Например, если вы увидели кусок кода, который содержал someThread.sleep()
, вы могли бы быть обмануты, полагая, что someThread
уложен в сон. Однако, поскольку sleep()
является статическим, этот код фактически вызывает Thread.sleep()
, который спит в текущем потоке.