2011-09-06 25 views
61

¿Podemos hacer un == en una variable Class en lugar de equals y esperar el mismo resultado?Java es igual para una clase. Es == igual que .equals

Por ejemplo:

Class clazz = xyz; 

Caso A:

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

Caso B:

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

Son los casos A y B funcionalmente iguales?

+2

Posible duplicado -http: //stackoverflow.com/questions/971954/difference-between-equals-and – mre

+9

@mre, así mi pregunta es específicamente sobre instancias de tipo Clase. ¿Está garantizado que el cargador de clases devuelva la misma instancia de Clase para un tipo de datos dado o no? – Ramesh

+0

Basado en algunos experimentos rápidos, parece que sí. Sin embargo, no sé si está guardado. –

Respuesta

77

La clase es definitiva, por lo que sus iguales() no se pueden anular. Sus método equals() se hereda del objeto que lee

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

Así que sí, que son la misma cosa para una clase, o de cualquier tipo que no anula equals(Object)

Para responder a su segunda pregunta, cada uno ClassLoader solo puede cargar una clase una vez y siempre le dará la misma Clase para un nombre completo calificado.

+4

¿es posible que dos cargadores de diferentes clases produzcan clases diferentes y se encuentren? – voipp

+2

@voipp es posible que pueda tener dos instancias de la "misma" clase obtenidas de dos cargadores de clases diferentes, pero tal situación no surgiría bajo circunstancias normales – kbolino

+1

E incluso si esa situación llegara, las dos clases seguirían estando considerado distinto según el método de igualdad. Tendría que comparar las clases por nombre si quería saber si son las "mismas", pero aún podrían ser dos versiones diferentes de la misma clase o incluso una colisión accidental creada por dos desarrolladores diferentes. Desde el punto de vista de jvm, por supuesto, no son intercambiables, incluso si resultan ser idénticos. –

5

Sí.

Tome un vistazo a la Class class description y observe que hereda equals de Object, para el que el método lee:

"El método equals de la clase Object implementa la relación de equivalencia posible más exigente en los objetos, es decir, para cualquier valor de referencia no nulo xey, este método devuelve verdadero si y solo si xey se refieren al mismo objeto (x == y tiene el valor verdadero). "

4

Sí, ya que el código de equals(...) para la clase es la siguiente:

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