Autor Tema: Diferencia entre tipo estático y tipo dinámico Java POO sobreescritura CU00690B  (Leído 1769 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
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.

Citar
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.

Citar
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.

Citar
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

Código: [Seleccionar]
/**
 * 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;
    }
}

Citar
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
Código: [Seleccionar]
/**
 * 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;
    }
}

Citar
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
Código: [Seleccionar]
/**
 * 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());
    }
}

Citar
¿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. ;)
« Última modificación: 13 de Agosto 2019, 19:58 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, para quien revise este ejercicio, algunos comentarios.

En lugar de "No se puede hacer t=v por que el objeto Vehiculo no puede heredar del objeto Taxi" sería más correcto "No se puede hacer t=v por que el objeto t que contiene una referencia a una instancia de subclase no se puede hacer que apunte a una instancia de superclase porque el compilador no lo permite debido a que generaría inseguridad de tipos."

El método toString() no está correctamente planteado porque no se hace uso de reutilización de código entre la subclase y la superclase. Es decir, el método de la subclase debe reutilizar el método de la superclase invocándolo con la palabra clave super. Tal y como está planteado, si se invoca toString() sobre un objeto Taxi, no se muestra la información de matrícula y número de ruedas.

Puede verse una solución correcta a este ejercicio en https://aprenderaprogramar.com/foros/index.php?topic=1147.0

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".