La pregunta SCJP del día - Autoboxing

(Imagen : Pancho Fierro - Capeador de Toros)
Como para que vayan calentando para el examen, aquí les dejo una preguntita (la pongo en inglés, porque el examen está en inglés... y sorry por la indentación!):
package wrapper_boxing;
public class WrapperTest2
{
public static void main(String[] args)
{
Boolean bool1 = new Boolean(true);
Boolean bool2 = new Boolean(false);
Boolean bool3 = new Boolean("false");
Boolean bool4 = new Boolean(bool1);
System.out.println(bool1.equals(bool4));
System.out.println(bool2 == bool3);
System.out.println(bool1 == bool4);
}
}
  1. The program will not compile because the creation of bool4 object will cause compilation error.
  2. The program will produce the output 'true false false'.
  3. The program will produce the output 'true true true'.
  4. The program will output 'true false true'.

Entonces... veamos. Si revisamos la especificación de Boolean, veremos que no tiene un constructor del tipo Boolean (Boolena b). ¿Entonces la 1. es correcta?... No!!! Recuerden que desde J2SE 5 se aplica autoboxing, por lo que se extraerá el valor boolean (primitivo) del objeto y será pasado al constructor, por lo que no habrá problemas de compilación.

La primera comparación entre bool1 y bool4 se hace mediante "equals", por ende es una comparación semántica donde se comparan valores. Como bool1 y bool4 tienes valores de "true", entonces la comparación será true. En la siguiente línea, la comparación entre bool2 y bool3 se hace mediante el operador "==" lo que implica que se están comparando direcciones de memoria , por lo que al tratarse de objetos diferentes (cada uno fue instanciado independientemente) la comparación nos arroja "false". De manera similar en la siguiente línea, la comparación de dos objetos diferentes nos arroja "false"

Concluyendo, la respuesta correcta es la 2.

Pregunta tomada de JavaBeat

Publicar un comentario