2015-06-25 3 views
0

В приведенном ниже коде,Что такое идентификация и состояние объектов типа "java.lang.Enum" в java?

class Example{} 
Example ex1 = new Example(); 
Example ex2 = new Example(); 
bool compareAddress = (ex1 == ex2); 

здесь, compareAddress дает false, потому что идентичность это адрес памяти объекта, на который указывает ex1 и ex2. значения полей (если они есть) в объекте типа class Example{} определяют состояние этого объекта.

Но в коде ниже,

enum Company{ 
    EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25); 
    private int value; 

    private Company(int value){ 
     this.value = value; 
    } 

} 
Company x1 = Company.EBAY; 
Company x1 = Company.EBAY; 
bool compareValues = (x1 == x2); 

здесь, compareValues дает true.

Итак, Что такое идентификация и состояние объекта, на которое указывают x1 и x2?

ответ

4

An enum is a special type of class.

Например

enum Company { 
    EBAY 
} 

будет компилировать в

final class Company extends Enum<Company> { 
    public final static Company EBAY = new Company(); // almost, this constructor invocation will have arguments 
} 

Поле EBAY будет, на оставшуюся часть процесса Java жизни, удерживая ту же опорное значение, которое является ссылкой на экземпляр Company.

С JLS,

Поскольку существует только один экземпляр каждой константы перечисления, то разрешается использовать оператор == вместо метода equals при сравнении двух ссылок на объекты, если известно, что по меньшей мере один из них содержит enum константу.

+0

компилировать в? Можете ли вы предоставить доступ к ресурсу, который предоставляет такую ​​информацию? – overexchange

+0

@overexchange Да, см. Ссылки, приведенные в ответе. _ Для каждой переменной enum c, объявленной в теле объявления E, E имеет неявно объявленное публичное статическое конечное поле типа E, которое имеет то же имя, что и c. Поле имеет переменный инициализатор, состоящий из c, и аннотируется теми же аннотациями, что и c._ –

+0

В моем предыдущем запросе неправильно сказано, что «x1 == x2» сравнивает значения. '==' фактически сравнивает ссылки на объекты. верный? – overexchange

Смежные вопросы