java.lang.Object o = 1; // ¿por qué esta compilación?
-
23-09-2019 - |
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
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 Object
s 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.