2015-06-25 48 views
0

在下面的代碼,什麼是Java中「java.lang.Enum」類型對象的身份和狀態?

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

這裏,compareAddress給出false,因爲身份是由ex1ex2指出的對象的存儲器地址。字段值(如果有的話)在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); 

這裏,compareValuestrue

那麼,x1x2指向的對象的身份和狀態是什麼?

回答

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

@overchange是的,請參閱答案中提供的鏈接。 _對於在E聲明的主體中聲明的每個枚舉常量c,E有一個隱式聲明的類型爲E的公共靜態final字段,其名稱與c相同。該字段有一個由c組成的變量初始值設定項,並用與c._ –

+0

相同的註釋標註。在我上面的查詢中,我錯誤地說'x1 == x2'是比較值。 '=='實際上比較對象引用。正確? – overexchange