2011-09-06 102 views
61

我们可以在Class变量上代替equals做一个==并且期望得到相同的结果吗?Java等于一个类。与.equals相同

例如:

Class clazz = xyz; 

方案A:

if(clazz == Date.class) { 
// do something 
} 

案例B:

if(Date.class.equals(clazz)) { 
// do something 
} 

是方案A和方案B在功能上一样吗?

+2

可能的复制-http://stackoverflow.com/questions/971954/difference-between-equals-and – mre

+9

@mre,以及我的问题是关于Class类型的实例。类加载器是否保证为给定数据类型返回相同类的实例? – Ramesh

+0

基于一些快速实验,它看起来像是。不过,我不知道它是否受到保护。 –

回答

77

类是final的,所以它的equals()不能被覆盖。它的equals()方法是从对象读取

public boolean equals(Object obj) { 
    return (this == obj); 
} 

所以,是的,他们是一类,或任何类型的同样的事情不覆盖equals(Object)

要回答你的第二个问题,每个继承ClassLoader只能加载一次类,并且始终会为给定的完全限定名称提供相同的Class。

+4

是否有可能两个不同的类加载器产生不同的类,他们碰到? – voipp

+2

@voipp您可以从两个不同的类加载器获得两个“相同”类的实例,但在正常情况下不会出现这种情况 – kbolino

+1

即使这种情况确实到来,这两个类仍然会根据等号方法认为是不同的。如果你想知道它们是否是“相同的”,你必须按名称比较这些类,但是它们仍然可能是同一类的两个不同版本,或者甚至是由两个不同的开发者创建的意外碰撞。当然,从jvm的角度来看,即使它们碰巧是相同的,它们也是不可互换的。 –

5

是的。

看看的Class class description并注意它继承equalsObject,对于其方法如下:

“的等于Object类的方法实现对象上差别可能性最大的相等关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象(x == y的值为true)时,此方法返回true。“

4

是,由于equals(...)类的代码如下:

public boolean equals(Object obj) { 
    return (this == obj); 
} 
相关问题