2016-11-27 4 views
4

Это образец кода у меня есть:Каково значение по умолчанию для переменной экземпляра типа Enum в Java?

enum A { 
    A, 
} 

class TestA { 
    A a; 
    public static void main(String[] args) { 
     final TestA testA = new TestA(); 
     System.out.println(testA.a); 
     System.out.println(testA.a.A); 
    } 
} 

Что напечатает:

null 
A 

Если значение по умолчанию для неинициализированного экземпляра переменной Enum является нулевым, как делает доступ экземпляр Enum работы ?

ответ

7

A.A - статическая переменная. Плохая идея, но авторизованная, для доступа к статической переменной класса с использованием переменной, относящейся к экземпляру этого класса, даже если она равна нулю. Это не ограничивается перечислениями:

Integer i = null; 
System.out.println(i.MAX_VALUE); 

работает нормально. Но это действительно должно быть указано как

System.out.println(Integer.MAX_VALUE); 
4

Константы континуума являются по существу статическими элементами, поэтому они подчиняются тем же правилам, что и статические элементы.

Причина, по которой это работает, является именно тем, почему ((System) null).out не вызовет NPE, потому что он превратился в статический членский доступ, который никак не использует null.