Hola Lorenzo31!
Primero, como sana y buena costumbre deseo agradecerte analisis, devolución y el tiempo dedicado para eso.
Lo resalto porque es una señal de respeto y agradecimiento de parte de los foreros mas novatos. Sin vuestra presencia y buena predisposición no sería posible avanzar solo leyendo el curso.
Vamos a la pregunta b).
Es un excelente debate
Leí tu ejercicio y me gustaría analizar un poco:
Código 1:
public class test {
public static void main (String[] Args){
Vehiculo v1 = new Vehiculo();
Taxi t1 = new Taxi();
v1 = t1;
t1 = (Taxi)v1;
System.out.println("Ejecuta");
}
}
El código 1 me llevó a la duda de contestar que sí. pero luego lo modifiqué (Código 2) y si bien compiló correctamente, dio un error en tiempo de ejecución.
Código 2:
public class test {
public static void main (String[] Args){
Vehiculo v1 = new Vehiculo();
Taxi t1 = new Taxi();
//v1 = t1;
t1 = (Taxi)v1;
System.out.println("Ejecuta");
}
}
Mis conclusiones fueron:
Si v1 (de tipo de vehiculo) apunta a un objeto tipo taxi, solo vamos a poder usar los métodos correspondientes al tipo vehículo, pero esto no quiere decir que estamos cortando el objeto tipo taxi, solo no podemos acceder a todos los métodos de este. En realidad si podríamos si hacemos t1.nombreDeMetodo(). Si t1 fuese anónimo "Vehiculo v1 = new Taxi();" entonces no podríamos acceder a todos los métodos del tipo Taxi, solo a los del tipo Vehiculo.
Dicho esto,
¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?
A mi criterio si tomamos en cuenta código 1, la respuesta será si.
Pero, a mi manera de verlo, hay una trampa. v1 está apuntando a un objeto tipo taxi, por lo tanto "t1 = (Taxi)v1" estamos re apuntando t1 a un objeto ya era de tipo taxi, por lo tanto el casting funciona correctamente.
Ahora si tomamos en cuenta el código 2, "t1 = (Taxi)v1" donde v1 referencia a un objeto de tipo vehiculo, entonces t1 (aplicando enmascaramiento de tipos o casting) estaría referenciando a un objeto con menos metodos que los tiene un tipo taxi.
Al intentar ejecutar este código me dio un error en tiempo de ejecución y por eso mi respuesta fue que no se puede.