Autor Tema: Sobreescribir métodos en Java. Ejemplo tipo estático y dinámico. CU00690B  (Leído 4642 veces)

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Hola!

Vengo a resolver el ejercicio 90° del curso, donde se nos da una serie de preguntas...

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?

Por lo que lei en caps anteriores, no seria posible esto.

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

Asi es.. si es posible.

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.

Código: [Seleccionar]
package CarrosJava;

public class Vehiculo {
    String matricula; int numeroRuedas;
    public Vehiculo(String matricula, int numeroRuedas){
      this.matricula = matricula;
      this.numeroRuedas = numeroRuedas;
   }
   
    public void setMatricula(String dato){matricula = dato;}   
    public void setNumeroRuedas(int dato){numeroRuedas = dato;}
    public String getMatricula(){return matricula;}
    public int getNumeroRuedas(){return numeroRuedas;}
    public String toString(){
        return "Maticula del vehiculo: " + getMatricula()
                + "Numero de Ruedas: " + getNumeroRuedas();
    }
}

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.

Código: [Seleccionar]
package CarrosJava;

public class Taxi extends Vehiculo {
    private String nombreConductor;
    private int numeroPlazas;
    public Taxi(String matricula, int numeroRuedas, String nombreConductor, int numeroPlazas){
        super(matricula,numeroRuedas);
        this.nombreConductor = nombreConductor;
        this.numeroPlazas = numeroPlazas;
    }
   
    public void setNombreConductor(String dato){nombreConductor = dato;}
    public void setNumeroPlazas(int dato){numeroPlazas = dato;}
    public String getNombreConductor(){return nombreConductor;}
    public int getNumeroPlazas(){return numeroPlazas;}
    public String toString(){
        return "Nombre del conductor: "+getNombreConductor()+"\nNumero de Plazas: "+getNumeroPlazas();
    }
}

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

Código: [Seleccionar]
package CarrosJava;

public class test {
    public static void main(String[]args){
        Vehiculo carrito = new Taxi("DAN-4533",4,"Dan",4);
        System.out.println(carrito.toString());
    }
}

Y el resultado fue:

Se ejecuto el método toString() de la propia clase Vehiculo, se declaro el objeto carrito como tipoVehiculo, ademas leí que al hacer:

 Vehiculo carrito = new Taxi("DAN-4533",4,"Dan",4);

Se esta agregando un objeto desconocido de forma dinámica al tipo Taxi!

Si algo anda mal, o respuesta incorrecta, me podrían comentar de cual se trata! :)
« Última modificación: 26 de Abril 2015, 17:09 por Alex Rodríguez »
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Dan, viendo los apartados:

a) La respuesta es que sí sería posible haciendo un casting. Ejemplo en https://www.aprenderaprogramar.com/foros/index.php?topic=1147.0

b) Correcto

c) Correcto

d) En la clase hija debes hacer uso de super en aquellos métodos donde sea conveniente, por ejemplo en el método toString. Ejemplo en https://www.aprenderaprogramar.com/foros/index.php?topic=1147.0

e) Se ejecutará el método toString() del tipo contenido en el objeto (es decir, de Taxi) aunque se declarara como tipo Vehiculo

¿Estás seguro de esto?
Citar
Se ejecuto el método toString() de la propia clase Vehiculo


Saludos

Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Ehmm... disculpas por eso, al parecer me he confundido  :-X

Quise decir: Se ejecuto el metodo toString() de la clase taxi, y la explicación para esto es que java utiliza variables dinámicas anónimas en tiempo de ejecución, ¿Verdad?
"Luchar por tus sueños y cumplirlos... eso es vivir.."

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Dan la explicación para esto es que Java busca dando prioridad al tipo dinámico de los objetos. Como se explica en la entrega CU00690B es:

Citar
Si como hemos dicho, el compilador se basa en el tipo estático para su trabajo, podríamos pensar que si invocamos a un objeto de tipo estático “superclase” y tipo dinámico “subclase” con un método sobreescrito, el método que se utilice sería el propio de la superclase. Pero sin embargo, esto no es así: el control de tipos del compilador se basa en los tipos estáticos pero en tiempo de ejecución los métodos que se ejecutan dan preferencia al tipo dinámico. Es decir, en tiempo de ejecución Java está constantemente “buscando” (“ligando” o “despachando”) el método que corresponda en función del tipo dinámico al que apunta una variable. Si el método invocado no se encuentra definido en el tipo dinámico de que se trate, Java busca el método en la superclase para tratar de ejecutarlo. Si no lo encuentra en la superclase, continúa subiendo niveles de clase hasta alcanzar a la clase Object. Si en la clase Object tampoco se encontrara un método con ese nombre, el programa no llegaría a compilar. Decimos que los métodos en Java son polimórficos porque una misma llamada en un programa puede dar lugar a la ejecución de distintos métodos según el tipo dinámico de una variable.

Saludos


Dan_SB

  • Avanzado
  • ****
  • Mensajes: 273
  • *<DanielsCK>*
    • Ver Perfil
Muchas gracias por tus correcciones alex

Saludos!
"Luchar por tus sueños y cumplirlos... eso es vivir.."

 

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