Autor Tema: Tipo estático y dinámico java casting entre padres e hijos Ejercicio CU00690B#  (Leído 5336 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
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.

« Última modificación: 13 de Agosto 2019, 19:56 por Ogramar »

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Ejercicio CU00690B
« Respuesta #1 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.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00690B
« Respuesta #2 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

 

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