SOBREESCRIBIR MÉTODOS EN JAVA. TIPO ESTÁTICO Y DINÁMICO. LIGADURA.
MÉTODOS POLIMÓRFICOS.
a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
No. Considerando lo siguiente:
Vehiculo v1 = new Vehiculo(); //creamos un objeto de la super clase.
Taxi t1 = new Taxi(); //creamos un objeto de la subclase.
t1 = v1; //Error en compilación al tratar de hacer que la variable t1 apunte al objeto de v1.
t1 = (Taxi)v1; //La compilacion es posible gracias al "casting" pero en tiempo de ejecucion se optiene el siguiente error:
java.lang.ClassCastException: CU00690B.Persona cannot be cast to CU00690B.Medicob) ¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?
Si. Considerando lo siguiente:
Vehiculo v2 = new Taxi(); //El codigo compila y se ejecuta sin errores.
c) Escribe el código de una clase Vehiculo con los atributos matricula (String) y numeroDeRuedas (int), constructor, métodos getters y setters y método toString() para mostrar la información de un vehículo.
public class Vehiculopublic class Vehiculo
{
private String matricula;
private int numeroDeRuedas;
public Vehiculo(String matricula, int numDeRuedas)
{
this.matricula = matricula;
numeroDeRuedas = numDeRuedas;
}
//Setters
public void setMatricula(String matricula)
{
this.matricula = matricula;
}
public void setNumeroDeRuedas(int numRuedas)
{
numeroDeRuedas = numRuedas;
}
//Getters
public String getMatricula()
{
return matricula;
}
public int getNumeroDeRuedas()
{
return numeroDeRuedas;
}
//Otros metodos
public String toString()
{
return "Matricula: " + matricula + "\nNumero de ruedas: " + numeroDeRuedas;
}
}
d) Escribe el código de una clase Taxi que herede de vehículo y que además de los atributos de Vehiculo lleve un atributo adicional nombreDelConductor (String) y numeroDePlazas (int), constructor, métodos getters y setters y método toString() para mostrar la información de un Taxi.
public class Taxi extends Vehiculopublic class Taxi extends Vehiculo
{
private String nombreDelConductor;
private int numeroDePlazas;
public Taxi(String matricula, int numDeRuedas, String nombreDelConductor, int numDePlazas)
{
super(matricula, numDeRuedas);
this.nombreDelConductor = nombreDelConductor;
numeroDePlazas = numDePlazas;
}
//Setters
public void setNombreDelConductor(String nombre)
{
nombreDelConductor = nombre;
}
public void setNumeroDePlazas(int numPlazas)
{
numeroDePlazas = numPlazas;
}
//Getters
public String getNombreDelConductor()
{
return nombreDelConductor;
}
public int getNumeroDePlazas()
{
return numeroDePlazas;
}
//Otros metodos
public String toString()
{
return super.toString() + "\nNombre del conductor: " + nombreDelConductor + "\nNumero de plazas: " + numeroDePlazas;
}
}
e) Escribe el código de una clase test con el método main que cree un objeto cuyo tipo es Vehiculo, instanciado como Taxi. Establece valores para sus atributos y usa el método toString().
public class Testpublic class Test
{
public static void main(String []args)
{
Vehiculo t1 = new Taxi("DC-2030", 4, "Jason Statham", 2);
System.out.println("Datos del taxi numero 1:\n\n" + t1.toString());
}
}
¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi?
Se ejecuta el metodo toString(); sobre escrito en la clase Taxi.
¿Por qué?
Aunque el objeto esta declarado como tipo Vehiculo en tiempo de ejecución el JVM se basa en su tipo dinamico (Taxi) y entonces comienza la búsqueda de este método a partir de la subclase Taxi, de no encontrar este método sobre escrito en la clase Taxi, entonces ejecutaría el método también sobre escrito de la clase Vehiculo, el resultado en esta ocasión y debido a la acción que se le indica realizar a este método sobre escrito de la clase Vehiculo, seria imprimir por pantalla un String que contiene el valor de sus únicos dos campos de clase. De no encontrar este método sobre escrito en la clase Vehiculo, entonces lo busca en la clase (Object) padre de todas las clases.
Como siempre sus comentarios correctivos son siempre bienvenidos.
Saludos!