Hola
Expongo la resolución al ejercicio CU00690B del taller de programación Java con IDE Bluej sobre los tipos estáticos, dinámicos y la sobreescritura de métodos.
El ejercicio en primer lugar plantea 2 preguntas:
¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
Un objeto de tipo estático Taxi no puede contener un objeto Vehiculo en tiempo de ejecución, porque su tipo dinámico (Vehiculo) es la superclase de Taxi.
¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?
Un objeto de tipo estático Vehiculo si puede contener un objeto Taxi en tiempo de ejecución, porque su tipo dinámico (Taxi) es subclase de Vehiculo.
Código fuente ejercicio:
Clase Test
package aplicacion;
import vehiculo.*;
public class Test {
public static void main(String[] args) {
Vehiculo v1 = new Taxi();
v1.setMatricula("0396FKX");
v1.setNumeroDeRuedas(4);
System.out.println(v1.toString());
}
}
Superclase Vehiculo
package vehiculo;
public class Vehiculo {
private String matricula;
private int numeroDeRuedas;
//Constructor
public Vehiculo(){
}
//Getters and Setters
public String getMatricula(){
return matricula;
}
public void setMatricula(String valorMatricula){
matricula = valorMatricula;
}
public int getNumeroRuedas(){
return numeroDeRuedas;
}
public void setNumeroDeRuedas(int valorNumeroDeRuedas){
numeroDeRuedas = valorNumeroDeRuedas;
}
public String toString(){
return "Información del vehículo: Matrícula: "+matricula+" Número de ruedas: "+numeroDeRuedas;
}
}
Subclase Taxi
package vehiculo;
public class Taxi extends Vehiculo{
private String numeroDelConductor;
private int numeroDePlazas;
//Getters and Setters
public String getNumeroDelConductor() {
return numeroDelConductor;
}
public void setNumeroDelConductor(String numeroDelConductor) {
this.numeroDelConductor = numeroDelConductor;
}
public int getNumeroDePlazas() {
return numeroDePlazas;
}
public void setNumeroDePlazas(int numeroDePlazas) {
this.numeroDePlazas = numeroDePlazas;
}
//Método toString sobreescrito
public String toString(){
return "Información del taxi: Número del conductor: "+numeroDelConductor+" Número de plazas: "+numeroDePlazas;
}
}
Ejecución del programa
Información del taxi: Número del conductor: null Número de plazas: 0
Preguntas:
¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi? ¿Por qué?
El método toString() que se ejecuta es el de la clase Taxi, esto es debido a que en tiempo de ejecución los métodos que se ejecutan dan preferencia al tipo dinámico que en este caso es Taxi.
Saludos