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

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola,

Dejo mi resolucion para el ejercicio CU00690B

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

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

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.

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.

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(). ¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi? ¿Por qué?

a) No, porque el objeto de tipo estático declarado Taxi posee mas atributos y métodos que el de tipo Vehiculo.

b) Si, es posible.

c)
Código: [Seleccionar]
public class Vehiculo {
   
    private String matricula;
    private int numeroDeRuedas;
   
    public Vehiculo(String matricula, int numeroDeRuedas) {
       this.matricula=matricula;
       this.numeroDeRuedas=numeroDeRuedas;
    }
    public void setMatricula(String matricula) {
        this.matricula=matricula;
    }   
    public void setNumeroDeRuedas(int numeroDeRuedas) {
        this.numeroDeRuedas=numeroDeRuedas;
    }   
    public String getMatricula() { return matricula; }
    public int getNumeroDeRuedas() { return numeroDeRuedas; }
    public String toString() {
        return "Matricula : "+matricula+"\nNumero de Ruedas : "+numeroDeRuedas;
    }   
}

d)
Código: [Seleccionar]
public class Taxi extends Vehiculo {
    private String nombreDelConductor;
    private int numeroDePlazas;
   
    public Taxi(String matricula, int numeroDeRuedas, String nombreDelConductor, int numeroDePlazas) {
        super(matricula, numeroDeRuedas);
        this.nombreDelConductor = nombreDelConductor;
        this.numeroDePlazas = numeroDePlazas;
    }
    public void setNombreDelConductor (String nombreDelConductor) {
        this.nombreDelConductor = nombreDelConductor;
    }
    public void setNumeroDePlazas (int numeroDePlazas) {
        this.numeroDePlazas = numeroDePlazas;
    }
    public String getNombreDelConductor() { return nombreDelConductor; }
    public int getNumeroDePlazas() { return numeroDePlazas; }
    public String toString() {
        //System.out.println(super.toString());
        return super.toString()+"\nNombre del conductor : "+nombreDelConductor+"\nNumero de plazas : "+numeroDePlazas;
    }
}

e)
Código: [Seleccionar]
public class Test {
    public static void main (String[] args) {
        Vehiculo vehiculo1 = new Taxi("taxi1", 4, "Luis Miguel", 3);
        System.out.println(vehiculo1.toString());
    }
}

Se aplica el método toString() de la clase Taxi ya que estamos sobreescribiendo dicho método y java es capaz de distinguir cual método sobreescrito debe usar en tiempo de ejecución.

Gracias!


« Última modificación: 31 de Julio 2015, 11:15 por Alex Rodríguez »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Tipo estático y dinámico. Ejercicio (CU00690B) resuelto
« Respuesta #1 en: 30 de Julio 2015, 10:53 »
Buenas todo correcto menos la pregunta a) que es sí.
Te paso el link de mi ejercicio donde también falle esa pregunta y el link donde se explica ese tema.

https://www.aprenderaprogramar.com/foros/index.php?topic=2394.msg11393#msg11393

https://www.aprenderaprogramar.com/foros/index.php?topic=1147.0

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Re:Tipo estático y dinámico. Ejercicio (CU00690B) resuelto
« Respuesta #2 en: 30 de Julio 2015, 16:42 »
Hola Lorenzo31!

Primero, como sana y buena costumbre deseo agradecerte analisis, devolución y el tiempo dedicado para eso.
Lo resalto porque es una señal de respeto y agradecimiento de parte de los foreros mas novatos. Sin vuestra presencia y buena predisposición no sería posible avanzar solo leyendo el curso.

Vamos a la pregunta b).
Es un excelente debate  :)
Leí tu ejercicio y me gustaría analizar un poco:

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


El código 1 me llevó a la duda de contestar que sí. pero luego lo modifiqué  (Código 2) y si bien compiló correctamente, dio un error en tiempo de ejecución.

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

Mis conclusiones fueron:

Si v1 (de tipo de vehiculo) apunta a un objeto tipo taxi, solo vamos a poder usar los métodos correspondientes al tipo vehículo, pero esto no quiere decir que estamos cortando el objeto tipo taxi, solo no podemos acceder a todos los métodos de este. En realidad si podríamos si hacemos t1.nombreDeMetodo(). Si t1 fuese anónimo "Vehiculo v1 = new Taxi();" entonces no podríamos acceder a todos los métodos del tipo Taxi, solo a los del tipo Vehiculo.

Dicho esto,

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

A mi criterio si tomamos en cuenta código 1, la respuesta será si.
Pero, a mi manera de verlo, hay una trampa. v1 está apuntando a un objeto tipo taxi, por lo tanto "t1 = (Taxi)v1" estamos re apuntando t1 a un objeto ya era de tipo taxi, por lo tanto el casting funciona correctamente.

Ahora si tomamos en cuenta el código 2, "t1 = (Taxi)v1" donde v1 referencia a un objeto de tipo vehiculo, entonces t1 (aplicando enmascaramiento de tipos o casting) estaría referenciando a un objeto con menos metodos que los tiene un tipo taxi.
Al intentar ejecutar este código me dio un error en tiempo de ejecución y por eso mi respuesta fue que no se puede.


Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
bueno, es opinable claro, pero solo que tengas presente que existe esa opcion.

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
De acuerdo!

Muchas gracias!

 

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