Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: toni_apr en 11 de Agosto 2014, 21:26

Título: Tipo estático y dinámico java casting entre padres e hijos Ejercicio CU00690B#
Publicado por: toni_apr en 11 de Agosto 2014, 21:26
Preguntas y respuestas. Diferencia entre Tipo estático y dinámico java. Ejercicio CU00690B del tutorial de programación POO de aprenderaprogramar.

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

Respuesta: SI. en tiempo de ejecución el objeto puede apuntar a un objeto de su clase padre o Superclase haciendo una conversión de tipo (casting) a la superclase

Ejemplo

Persona p1 = new Persona();
Medico m1 = new Medico()

La clase Persona es superclase de la clase Medico

La asignación m1 = p1; (poner en el objeto de una clase un objeto de la superclase)
da error.

Se puede conseguir la asignación haciendo 'casting'

m1 = (Medico) p1;



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

Respuesta: Si, siempre. Sin ningún género de duda.


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]
public class Vehiculo {             // Atributos de la clase Vehiculo
    private String matricula;
    private int numeroDeRuedas;
    //Constructor para objetos de la clase Vehiculo
   
    public Vehiculo(String matricula, int numeroDeRuedas) {            // Inicializa atributos
        this.matricula = matricula;
        this.numeroDeRuedas = numeroDeRuedas;
    } // Fin del constructor Vehiculo
   
    // Siguen los setters para los atributos de la clase Vehiculo
    public void setMatricula (String matricula)        { this.matricula = matricula; }
    public void setNumeroDeRuedas (int numeroDeRuedas) { this.numeroDeRuedas = numeroDeRuedas; }
   
    // Ahora los getters para los atributos de la clase Vehiculo
    public String getMatricula ()                      { return matricula; }
    public int getNumeroDeRuedas ()                    { return numeroDeRuedas; }
   
    // Y seguidamente, metodos varios.
    public String toString() {
        return "       Matricula: " + matricula + "\n" +
               "Numero de ruedas: " + numeroDeRuedas + "\n";
    }
} // Fin de la clase Vehiculo



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]
public class Taxi extends Vehiculo {             // Atributos de la clase Taxi
    private String nombreDelConductor;
    private int numeroDePlazas;
    //Constructor para objetos de la clase Taxi
    public Taxi(
   
    String matricula,
    int numeroDeRuedas,
    String nombreDelConductor,
    int numeroDePlazas) {            // Inicializa atributos
        super(matricula, numeroDeRuedas);
        this.nombreDelConductor = nombreDelConductor;
        this.numeroDePlazas = numeroDePlazas;
    } // Fin del constructor Taxi

    // Siguen los setters para los atributos de la clase Taxi
    public void setNombreDelConductor (String nombreDelConductor) { this.nombreDelConductor = nombreDelConductor; }
    public void setNumeroDePlazas (int numeroDePlazas)            { this.numeroDePlazas = numeroDePlazas; }
    // Ahora los getters para los atributos de la clase Taxi
    public String getNombreDelConductor ()                        { return nombreDelConductor; }
    public int getNumeroDePlazas ()                               { return numeroDePlazas; }
    // Y seguidamente, metodos varios.
    public String toString() {
        return super.toString() +
        "Nombre del conductor: " + nombreDelConductor + "\n" +
        "    Numero de plazas: " + numeroDePlazas;
    }
} // Fin de la clase Taxi



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


Clase Test

Código: [Seleccionar]
public class Test { 
    public static void main (String [] args) {
        String matricula = "AS-4567";
        int numeroDeRuedas = 3;
        String nombreDelConductor = "Ramiro";
        int numeroDePlazas = 3;
        Vehiculo v1 = new Taxi(matricula,numeroDeRuedas,nombreDelConductor,numeroDePlazas);
        System.out.println ("\nEl vehiculo v1 presenta estos atributos:\n" + v1.toString());
    } // fin del main
} // Fin de la clase Test


Respuesta: Se ejecuta el método toString() del tipo contenido en el objeto (Taxi) aunque se declarara como tipo Vehiculo

Porque en tiempo de ejecución, el compilador verifica el tipo que contiene el objeto y ejecuta sus métodos, solo si no los encuentra en el tipo instanciado los busca el la clase padre.

Título: Re:Ejercicio CU00690B
Publicado por: javi in the sky en 12 de Agosto 2014, 12:04
Hola toni, no hay donde ponerte un punto sobre una i, es decir, todo perfecto.

Por tratar algún detalle, en vez de

        String matricula = "AS-4567";
        int numeroDeRuedas = 3;
        String nombreDelConductor = "Ramiro";
        int numeroDePlazas = 3;
        Vehiculo v1 = new Taxi(matricula,numeroDeRuedas,nombreDelConductor,numeroDePlazas);

Podrías usar:


        Vehiculo v1 = new Taxi("AS-4567", 3,"Ramiro",3);
        System.out.println ("\nEl vehiculo v1 presenta estos atributos:\n" + v1.toString());


Esto es más compacto, pero no se puede decir que sea mejor que lo anterior. Depende de la situación. En este caso veo tan válido una cosa como otra.

Saludos.
Título: Re:Ejercicio CU00690B
Publicado por: toni_apr en 12 de Agosto 2014, 22:18
Hola javi
Gracias por revisar mi ejercicio.
Seguramente más de una vez me habreis de poner los puntos, las comas y lo que haga falta.
Tu observación sobre hacer código compacto, que siempre es positiva sin dudarlo, yo me la he saltado aquí, por una razón más estética que no técnica.
Mi asignación de valores a las variables es rimbombante, escandalosa si quieres.
Doy muchas voces para una cosa que tu haces en una línea.

Este programa era tan escuálido que tenía que rellenarlo. Y así ha quedado.

Saludos