2015-06-25 51 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