По умолчанию ставятся экземпляры перечислений?

enum Animals{
    DOG("woof"),
    CAT("Meow"),
    FISH("Burble");

    String sound;

    Animals(String s) {
            sound = s;
    }
}
public class TestEnum{
    static Animals a;
    public static void main(String ab[]){
        System.out.println( a );
        System.out.println( a.DOG.sound + " " + a.FISH.sound);
    }
}

В приведенном выше примере, почему мы можем обращаться к экземплярам перечисления (т.е. как..DOG.sound), когда a имеет значение null, а перечисление не объявляется как статическое? Являются ли экземпляры перечисления статическими по умолчанию?

Ответ 1

Перечисления неявно public static final.

Вы можете обратиться к a.DOG, потому что вы можете получить доступ к статическим членам через ссылки на экземпляры, даже если значение null: статическое разрешение использует ссылочный тип, а не экземпляр.

Я бы не стал; он вводит в заблуждение: конвенция поддерживает статические ссылки типа (не экземпляра).

См. JLS 6.5.6.2 относительно переменной класса через экземпляры. См. JLS 15.11, почему он все еще работает с null. Краткая характеристика: это ссылочный тип, а не экземпляр, через который статика разрешена.


Обновленные ссылки:/

JSE 6

JSE 7

JSE 8

Ответ 2

Да, перечисления эффективно статичны.