Enum不是primitive类型,却可以用==比较,这是为什么呢?Enum本身可以是多实例的,关键在于,它的每个值对应唯一的Object,因此,它有几个值,就生成几个实例。所有相关的变量都是代表这几个实例的,自然要么==,要么!=,比较值和比较地址是一样的。
看下面的例程:
public enum AA{ aa; public static void main(String[] args) throws Exception{ Constructor<?> constructor = AA.class.getDeclaredConstructors()[0]; Method method = Constructor.class.getDeclaredMethod("acquireConstructorAccessor"); method.setAccessible(true); method.invoke(constructor); Field field = Constructor.class.getDeclaredField("constructorAccessor"); field.setAccessible(true); ConstructorAccessor accessor = (ConstructorAccessor) field.get(constructor); AA aa1 = (AA) accessor.newInstance(new Object[]{"aa", 0}); AA aa2 = AA.aa; System.out.println(aa1.ordinal() == aa2.ordinal()); System.out.println(aa1 == aa2); } }
在程序中,使用反射机制创建了两个枚举对象并使用==进行比较,从而说明Enum并没有什么特殊之处。