Являются ли экземпляры перечислений статическими по умолчанию? - PullRequest
10 голосов
/ 25 ноября 2011
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);
    }
}

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

Ответы [ 2 ]

22 голосов
/ 25 ноября 2011

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

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

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

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


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

JSE 6

JSE 7

JSE 8

6 голосов
/ 25 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...