Autor Tema: Diferencia entre tipo estático y tipo dinámico en Java. Ejercicio CU00690B  (Leído 7526 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes, dejo la respuesta a mi ejercicio. Llevo tres días algo acatarrado de ahí mi ausencia :-)

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.

Pregunta a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?

Respuesta No.

Pregunta b) ¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?

Respusta Si.

Pregunta c) Clase Vehiculo

Código: [Seleccionar]

/**
 * Clase Vehiculo. Ejercicio 690B
 *
 * @author Lorenzo31
 * @version 19.04.2015
 */
public class Vehiculo {

    private String matricula;
    private int numeroDeRuedas;

    //Constructor
    public Vehiculo(String matricula, int numeroDeRuedas){ 
        this.matricula = matricula;
        this.numeroDeRuedas = numeroDeRuedas;
    }

    //Setters
    public void setMatricula(String matricula){ this.matricula = matricula; }

    public void setNumeroDeRuedas(int numeroDeRuedas){ this.numeroDeRuedas = numeroDeRuedas; }

    //Getters
    public String getMatricula(){ return matricula; }

    public int getNumeroDeRuedas(){ return numeroDeRuedas; }

    //Método toString devuelve un String
    public String toString(){ return ("La matricula del vehiculo es: " + matricula +
            "\n El numero de ruedas es: " + numeroDeRuedas); }
}


Pregunta d) Clase Taxi

Código: [Seleccionar]

/**
 * Clase Taxi extiende de Vehiculo. Ejercicio 690B
 *
 * @author Lorenzo
 * @version 19.04.2015
 */

public class Taxi extends Vehiculo {
   
    private String nombreDelConductor;
    private int numeroDePlazas;
   
    //Constructor
    public Taxi(String matricula, int numeroDeRuedas, String nombreDelConductor, int numeroDePlazas){
        super(matricula, numeroDeRuedas);
        this.nombreDelConductor = nombreDelConductor;
        this.numeroDePlazas = numeroDePlazas;
    }
   
    //Setters
    public void setNombreDelConductor (String nombreDelConductor){ this.nombreDelConductor = nombreDelConductor; }
    public void setNumeroDePlazas (int numeroDePlazas) { this.numeroDePlazas = numeroDePlazas; }
   
    //Getters
    public String getNombreDelConductor() { return nombreDelConductor; }
    public int getNumeroDePlazas() { return numeroDePlazas; }
   
    //Método toString
    public String toString(){ return ("\n El nombre del conductor es: " + nombreDelConductor + "\n El numero de plazas es: " + numeroDePlazas); }
       
}


Pregunta e-1) Clase TestVehiculo1

Código: [Seleccionar]

/**
 * Clase main ejecución ejercicio 690B
 *
 * @author Lorenzo31
 * @version 19.04.2015
 */
public class TestVehiculo1 {
   
    public static void main(String [] args) {
       
        Vehiculo coche;
       
        coche = new Taxi("B2345ELF",4,"Pedro Lopez", 5);
       
        System.out.println(coche.toString());
    }
}


Pregunta e-2)  ¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi? ¿Por qué?

Respuesta El metodo toString() que se aplica es el propio de la clase Taxi, ya que en el momento de llamar a la función toString la instancia apunta a un objeto de tipo Taxi.
« Última modificación: 22 de Abril 2015, 10:22 por Alex Rodríguez »

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Hola Lorenzo31! la respuesta a la pregunta a) es que sí, aunque es un poco difícil de explicar. Puedes ver la explicación en https://www.aprenderaprogramar.com/foros/index.php?topic=1276.0

La pregunta b) está bien la respuesta, la c) también (clase Vehiculo)

En la d) (clase Taxi) te falta la invocación a super en el método toString. Al ser una relación de herencia hemos de tener en cuenta lo que se hereda de la clase padre. Si no invocas a super en el método toString() no se mostrará toda la información completa (mira que en el constructor sí invocas a super para tener en cuenta a la clase padre). Puedes verlo en https://www.aprenderaprogramar.com/foros/index.php?topic=1147.0

La pregunta e) está bien la respuesta


Saludos!!

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenos días javi,

Primero gracias por tu respuesta, como siempre es un tiempo dedicado que se agradece infinito.

Empiezo por el final, basicamente puse el super.toString() pero como el ejercicio pedía que se viera que toString() concreto se ejecutaba, consideré a modo de test que era mas claro eliminarlo, así o solo se mostraba la info de Taxi o la de Vehiculos, en un ejercicio normal, hay que ponerlo sí o sí lo comprendo y es lógico.


Y sobre la pregunta

a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?

Me mantengo ciñendome a lo que leo en ella que No. Una cosa es que, como señala Mario en el link que me has pasado, en un momento dado de la ejecución, el contenedor v1 (Vehiculo) albergue un Taxi y evidentemente, con un cast, al ser instanceof Taxi lo pase sin problemas.

Pero la pregunta especifica un objeto Vehiculo, entiendo que apunte a un Vehiculo, y por lo que he leído y entendido ni con un casting se puede pasar, pues da error;

Java.lang.ClassCastException.

Si estoy equivocado, repasaré de nuevo el tema 689. Yo lo  entendíasí y supongo que el matiz que quereis se entienda es el "casting" de un Taxi dentro de Vehiculo es posible. Pero eso sigue siendo un Taxi :) no un objeto Vehiculo.
« Última modificación: 21 de Abril 2015, 12:43 por Lorenzo31 »

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?

Sobre este código lo que yo leería es esto:

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



Vehiculo v1 = new Vehiculo(); : v1 es un objeto de tipo estático vehiculo y tipo dinamico Vehiculo


Taxi t1 = new Taxi(); : t1 es un objeto de tipo estático Taxi y tipo dinámico Taxi

v1 = t1; : v1, que tiene declarado tipo estático vehículo, pasa a tipo dinámico Taxi

t1 = (Taxi)v1; : t1, que tiene tipo estático Taxi, ahora sigue con tipo dinámico Taxi pero referencia al objeto v1, que tiene declarado tipo estático Vehiculo

¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?

No podría contener a un objeto de tipo dinámico Vehiculo, pero sí a un objeto de tipo estático Vehiculo y tipo dinámico taxi.

Puede ser que me haya liado...

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas javi,

No, no te has liado, has resumido mejor que yo, lo que yo queria decir. Sí en ese caso lo veo así.

Yo solo matizaba que realmente en tiempo de ejecución,

v1 = t1; : v1, que tiene declarado tipo estático vehículo, pasa a (apuntar) a t1, tipo dinámico Taxi.

t1 = (Taxi)v1; : t1, que tiene tipo estático Taxi, ahora sigue con tipo dinámico Taxi pero referencia al objeto v1 que en tiempo de ejecucion apunta a Taxi, aunque tiene declarado tipo estático Vehiculo al empezar el programa.

De alguna manera mi respuesta seria NO, si v1 apunta a un Vehiculo, y sí si apunta en algun momento a un Taxi o subclase de Taxi, que a través de un casting se podría reReferenciar.

Gracias por las molestias y aclaraciones.

 

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