PREGUNTA: ¿Qué ocurrirá al compilar y ejecutar el siguiente código?class Padre {}
class ClaseHija extends Padre {}
class ClaseHija2 extends Padre {}
public class Test{
public static void main(String argv[]) {
Padre b=new Padre ();
ClaseHija s=(ClaseHija) b;
System.out.print("Ejecutando Aplicación");
}
}a. Compilará y se ejecutará sin problemas
b. Error de Compilación
c. Excepción en tiempo de ejecución
d. Excepción en tiempo de ejecución y luego mostrará el mensaje "Ejecutando Aplicación"
RESPUESTA: la opción correcta es la c)
Estas preguntas no son fáciles de responder (lo serían si tuviéramos un ordenador delante). Tratamos de analizar lo que hará el código.
Se declara una clase Padre, vacía. Se declara dos clases que herendan de Padre, ClaseHija y ClaseHija2. Estas clases se declaran sin modificador de acceso: esto es legal (se aplica un tratamiento por defecto previsto por Java). A continuación se declara la clase pública Test que contiene el método main.
Nos puede llamar la atención public static void main(String argv[]) ya que no se suele usar argv sino args, pero esto es igualmente legal, es el nombre de un parámetro para el método. Se declara un objeto de la clase Padre al que se denomina b. Se crea un objeto de la clase hija que es el objeto de la clase Padre convertido en hija (casting de padre a hija). ç
Aquí nos tenemos que plantear: ¿es legal convertir un objeto de un nivel jerárquico superior a un objeto de nivel jerárquico inferior? La respuesta es que esto sólo es posible si el objeto de nivel superior contiene un objeto del tipo del nivel inferior. Es decir, en este caso si el objeto b contuviera un objeto del tipo ClaseHija. Si no lo contiene, como es este caso, salta un error del tipo java.lang.ClassCastException en tiempo de ejecución. java.lang.ClassCastException: Padre cannot be cast to ClaseHija
En resumen, si hiciéramos ClaseHija s= b; obtendríamos un error en tiempo de compilación
Si hacemos ClaseHija s=(ClaseHija) b; la compilación es correcta pero salta un error ClassCastException en tiempo de ejecución.
Si hiciéramos Padre b=new ClaseHija (); el programa se ejecutaría sin error, ya que la clase padre contiene un objeto de la clase hija (legal, en eso consiste el polimorfismo).
Pregunta nada sencilla de responder en un examen