Pregunta

Me estaba haciendo una de estas pruebas Java en línea y me hicieron esta pregunta:

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);

Por favor, intente 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";

compilación y la salida 1 en ambos casos, este soy yo desconcertante.

Muchas gracias

¿Fue útil?

Solución

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

Otros consejos

Debido "1" es una instancia de una String, y desde 1,5 1 es auto-boxable a un Integer; Ambos tipos son subtipos de Object. Antes de la introducción autoboxing, Object o = 1; no se compilará.

Para obtener el máximo provecho de esta experiencia de aprendizaje, se debe tener en cuenta el método de Object getClass(). Mediante la adición de System.out.println(o.getClass().getName()), también se puede imprimir el nombre de la clase que el objeto referido por o pertenece. En su caso, son java.lang.String (por (Object) "1") y java.lang.Integer (por (Object) 1).

Sólo para completar, debería mencionar que ahora también puede hacer Object o = false;.

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

En el segundo caso, auto-boxing está ocurriendo. Integer es una subclase de objeto, por lo tanto, asignable a la misma. Del mismo modo, la salida de 1, entonces tiene mucho sentido.

Esto se debe a o es de tipo Object. Cada objeto, en Java, se extiende la Object clase. Así que ... cuando dices Object o = 1, se convierte a partir de 1 int a Integer, que es un Object. Del mismo modo, "1" es un String que es un Object. En ambos casos, llamando System.out.println en una Object invoca el método Objects toString. En ambos casos, se imprimirá 1.

Podemos poner Object o = anything; donde anything es cualquier objeto, porque todas las clases derivan de la clase Object. Funciona a partir de primitivas debido a que entró en función de Java 1.5 autoboxing.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top