2010-02-27 19 views
5

que estaba haciendo una de estas pruebas Java en línea y me hicieron esta pregunta: ¿java.lang.Object o = 1; // ¿por qué compila esto?

Q: Indicar asignación correcta:

Long l = 1; 
Double d = 1; 
Integer i = 1; 
String s = 1; 
Object o = "1"; 
System.out.println(o); 
o = 1; 
System.out.println(o); 

Inténtelo usted mismo antes de ir más lejos.

Bueno, yo puedo decir que me equivoqué, investigué y encontré:

//Long l = 1; //cannot widen and then box 
Long ll = 1L;//no need to widen, just box 
//Double d = 1;//cannot widen and then box 
Double dd = 1d;//no need to widen, just box 
Integer i = 1;//no need to widen, just box 
//String s = 1;//cannot do implicit casting here 

Object o = "1";//this compiles and is just plain weird 
System.out.println(o);//output is 1 
o = 1;//this also compiles and is also weird 
System.out.println(o);//output is 1 

Puede alguien decir por qué:

Object o = 1; y Object o = "1";

de compilación y la salida 1 en ambos casos , esto me desconcierta

Muchas gracias

Respuesta

9

"1" es una instancia de la clase cadena y cadena es una subclase de la clase de objetos en Java (como cualquier otra clase). 1 está encuadrado en un Entero, que también se deriva de Objeto.

+0

Guau, gracias por la respuesta, pero tengo que decirte que me siento tan estúpido ahora que debería saber esto. – Ramo

+0

@Ramo: no cuestionar algo que no sabes sería estúpido :-) – Grundlefleck

1

Bueno, el primer caso "1" es un literal String, por lo que una subclase de objeto, por lo tanto, asignable a ella. Como cadena, su salida de 1 es relativamente simple.

En el segundo caso, se está produciendo un auto-boxeo. Integer es una subclase de objeto, por lo tanto asignable a ella. De manera similar, la salida de 1 tiene perfecto sentido.

1

Esto es porque o es del tipo Object. Cada objeto, en java, extiende la clase Object. Entonces ... cuando dice Object o = 1, convierte 1 a de int a Integer, que es Object. Del mismo modo, "1" es un String que es un Object. En ambos casos, al llamar al System.out.println en un Object se invoca el método Object s toString. En ambos casos, imprimirá 1.

1

Puede poner Object o = anything; donde anything es cualquier objeto porque todas las clases se derivan de la clase Object. Funciona con primitivos debido a la función de autoboxing que entró en Java 1.5.

3

Porque "1" es una instancia de String, y desde 1.5 1 es auto-boxable a Integer; ambos tipos son subtipos de Object. Antes de que se introdujera el autoboxing, Object o = 1; no se compilaría.

Para aprovechar al máximo esta experiencia de aprendizaje, debe conocer el método ObjectgetClass(). Al agregar System.out.println(o.getClass().getName()), también puede imprimir el nombre de la clase a la que pertenece el objeto al que hace referencia o. En su caso, son java.lang.String (para (Object) "1") y java.lang.Integer (para (Object) 1).

Solo para completar, debo mencionar que ahora también puede hacer Object o = false;.

Cuestiones relacionadas