Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Dan_SB en 24 de Abril 2015, 21:39

Título: Sobreescribir métodos en Java. Ejemplo tipo estático y dinámico. CU00690B
Publicado por: Dan_SB en 24 de Abril 2015, 21:39
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! :)
Título: Re:Ejercicio (CU00690B), Sobreescribir métodos en Java. Tipo estático y dinámico.
Publicado por: Alex Rodríguez en 25 de Abril 2015, 15:02
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
Título: Re:Ejercicio (CU00690B), Sobreescribir métodos en Java. Tipo estático y dinámico.
Publicado por: Dan_SB en 25 de Abril 2015, 15:23
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?
Título: Re:Ejercicio (CU00690B), Sobreescribir métodos en Java. Tipo estático y dinámico.
Publicado por: Alex Rodríguez en 25 de Abril 2015, 16:55
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

Título: Re:Ejercicio (CU00690B), Sobreescribir métodos en Java. Tipo estático y dinámico.
Publicado por: Dan_SB en 25 de Abril 2015, 23:34
Muchas gracias por tus correcciones alex

Saludos!