Hola. Dejo el Ejercicio CU00690B del curso pdf de programación Java.
Sobreescribir métodos en Java. Tipo estático y dinámico. Ligadura. Métodos polimórficos.
EJERCICIO
Responde a las siguientes preguntas:
Supongamos la superclase Vehiculo que representa a cualquier tipo de vehículo y la subclase Taxi que representa a un tipo de vehículo concreto.
a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
Si.
El objeto puede apuntar a su SuperClase hiciendo Casting o conversion de tipos.
Vehiculo v=new Vehiculo.
Taxi t= new Taxi
En este caso se supone que taxi es una subclase de Vehiculo.
Se hace el Casting : t=(Taxi) v;
No se puede hacer t=v por que el objeto Vehiculo no puede heredar del objeto Taxi ya que este es una subclase de vehiculo y hereda de el.
Vehiculo al ser la superclase de taxi no puede heredar de este.
Es como si tuvieramos dos cajas una grande y otra mas pequeña, la caja grande es Vehiculo y la pequeña Taxi.
La caja grande (Vehiculo)) puede contener a Taxi pero la pequeña(Taxi) no puede contener a Vehiculo porque no cabe.
b) ¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?
Si. Siempre que Taxi herede de Vehiculo.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.
Clase Vehiculo/**
* Write a description of class Vehiculo here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Vehiculo
{
private String matricula;
private int numeroRuedas;
/**
* Constructor for objects of class Vehicuo
*/
public Vehiculo(String matricula, int numeroRuedas)
{
this.matricula=matricula;
this.numeroRuedas=numeroRuedas;
}
public String getMatricula() {
return matricula;
}
public int getNumeroRuedas () {
return numeroRuedas;
}
public void setMatricula(String matricula) {
this.matricula =matricula;
}
public void setNumeroRuedas(int numeroRuedas) {
this.numeroRuedas = numeroRuedas;
}
public String toString() {
return "Matricula : "+matricula +" Numero de Ruedas :"+numeroRuedas;
}
}
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.
Clase Taxi/**
* Write a description of class Taxi here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Taxi extends Vehiculo
{
private String nombreDelConductor;
private int numeroDePlazas;
/**
* Constructor for objects of class Taxi
*/
public Taxi(String matricula, int numeroRuedas,String nombreDelConductor,int numeroDePlazas)
{
super(matricula,numeroRuedas);
this.nombreDelConductor=nombreDelConductor;
this.numeroDePlazas=numeroDePlazas;
}
public String getnombreDelConductor() {
return nombreDelConductor;
}
public int getNumeroDePlazas () {
return numeroDePlazas;
}
public void setNombreDelConductor(String nombreDelConductor) {
this.nombreDelConductor =nombreDelConductor;
}
public void setNumeroDePlazas(int numeroDePlazas) {
this.numeroDePlazas = numeroDePlazas;
}
public String toString() {
return "Conductor: "+nombreDelConductor +" Numero 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().
Clase Test/**
* Write a description of class TestVehiculo here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class TestVehiculo
{
public static void main (String [ ] Args) {
Vehiculo taxi= new Taxi("25986-KBM",4,"PEPE RUIPEREZ",7);
System.out.println(taxi.toString());
}
}
¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi? ¿Por qué?
El de la clase Taxi ya que se ha creado el objeto instanciando a Taxi.Si el objeto se hubiera instanciado como Vehiculo taxi=new Vehiculo("25986-KBM",4 );
Se aplicaria el metodo de la clase Vehiculo.
En el caso de que no existiera el metodo toString() en el Objeto Taxi el JVM busca en las clases superiores en tiempo de ejecucion en este caso en Vehiculo y si no estuviera seguiria subiendo hasta llegar a la SuperClase Objet y si no lo encuentra en la SuperClase Object no llega a compilar.
Gracias.
Un saludo.