Autor Tema: Duda ejercicio entrega CU00690B sobreescribir métodos java  (Leído 6141 veces)

Libélula

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
En primer lugar, gracias a Álex Rodríguez por aclararme la duda anterior.

Ahora me surge otra, con el ejercicio de referencia. El caso es que, efectivamente, en respuesta a la pregunta e), el método toString() que se aplica en la ejecución es el de la subclase, porque se corresponde con el tipo dinámico Taxi.

Sin embargo, yo he decidido que el constructor de Taxi tenga 4 parámetros, los dos de la superclase Vehículo referenciados con super (matrícula y número ruedas) y otros dos correspondientes a los atributos específicos de su clase (nombre conductor y número de plazas).
En la clase test, cuando creo un objeto de la clase Vehiculo instanciado como Taxi (o incluso un objeto de la clase Taxi directamente), e invoco al constructor de Taxi, meto lógicamente los 4 parámetros de su constructor, pero al ejecutar, los valores aparecen con 0 en tipo int y con null en String. En un principio he pensado que era por el hecho de que un objeto de tipo estático Vehiculo no podía contener a un objeto instanciado como Taxi en ejecución, pero si asigno el tipo estático Taxi me pasa lo mismo. ¿Por qué?

Adjunto mi código por si es de ayuda:

Código: [Seleccionar]
public class Vehiculo{
    private String matricula;
    private int numRuedas;
   
    public Vehiculo(String pMatricula, int pNumRuedas){
        matricula = pMatricula;
        numRuedas = pNumRuedas;
    }
   
    public void setMatricula(String pMatricula){
        matricula = pMatricula;}
    public void setNumRuedas(int pNumRuedas){
        numRuedas = pNumRuedas;}
    public String getMatricula(){
        return matricula;}
    public int getNumRuedas(){
        return numRuedas;}
    public String toString(){
        return ("El vehículo tiene la matrícula " + matricula + " y tiene " + numRuedas + " ruedas");}
}       

Código: [Seleccionar]
public class Taxi extends Vehiculo{
    private String matricula;
    private int numRuedas;
    private String nombreConductor;
    private int numPlazas;
   
    public Taxi(String matricula, int numRuedas, String pNombreConductor, int pNumPlazas){
        super(matricula, numRuedas);
        pNombreConductor = nombreConductor;
        pNumPlazas = numPlazas;
    }   
    public void setMatricula(String pMatricula){
        matricula = pMatricula;}
    public void setNumRuedas(int pNumRuedas){
        numRuedas = pNumRuedas;}
    public void setNombreConductor(String pNombreConductor){
        nombreConductor = pNombreConductor;}
    public void setNumPlazas(int pNumPlazas){
        numPlazas = pNumPlazas;}
    public String getMatricula(){
        return matricula;}
    public int getNumRuedas(){
        return numRuedas;}
    public String getNombreConductor(){
        return nombreConductor;}
    public int getNumPlazas(){
        return numPlazas;}
    public String toString(){
        return ("El taxi tiene la matrícula " + matricula + ", tiene " + numRuedas + " ruedas, su conductor se llama " + nombreConductor + ", y tiene " + numPlazas + " plazas.");}
}

Código: [Seleccionar]
public class TestInstanciaTaxi{
    public static void main (String[] args){
       Taxi miVehiculo = new Taxi("9999ZZZ", 4, "Pedro Pérez Pérez", 5);     
       System.out.println(miVehiculo.toString());
    }
}
« Última modificación: 02 de Septiembre 2014, 18:28 por Alex Rodríguez »

Libélula

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re:Duda ejercicio entrega CU00690B
« Respuesta #1 en: 12 de Mayo 2014, 17:08 »
Perdón, en el código de la clase test creo el objeto con tipo Taxi, cuando debería ser Vehiculo:
 
Código: [Seleccionar]
Vehiculo miVehiculo = new Taxi("9999ZZZ", 4, "Pedro Pérez Pérez", 5);
Pero vamos, que como he dicho, los resultados 0 y null son los mismos.

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Duda ejercicio entrega CU00690B
« Respuesta #2 en: 12 de Mayo 2014, 20:25 »
Me parece que tienes cambido el orden:

        pNombreConductor = nombreConductor;
        pNumPlazas = numPlazas;

En vez de

        nombreConductor = pNombreConductor;
        numPlazas = pNumPlazas;

Libélula

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re:Duda ejercicio entrega CU00690B
« Respuesta #3 en: 12 de Mayo 2014, 21:01 »
Tienes razón, ha sido un fallo tonto por mi parte, pero eso sólo me soluciona parte del problema.
Efectivamente al ejecutar ahora el objeto miVehiculo instanciado como Taxi, los atributos propios de la subclase Taxi (conductor y número de plazas) toman el valor introducido como parámetro, pero los atributos de la superclase Vehiculo (matrícula y número de ruedas) siguen apareciendo a 0 y null, respectivamente.
Estoy cambiando los nombres de los parámetros, hacer que coincidan en la superclase y subclase, en lugar de utilizar p delante del parámetro, utilizando this, pero nada de nada.
Ayuda, por favor. (Espero no haber cometido otro fallo estúpido).

Libélula

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re:Duda ejercicio entrega CU00690B
« Respuesta #4 en: 12 de Mayo 2014, 21:58 »
Sin ánimo de ser pesado, y sólo para compartirlo con los demás por si a alguien le pasa lo mismo que a mí.
Creo que ya sé lo que ha podido pasar, a fuerza de muchas pruebas y errores y gracias a la entrega 92 que me estoy leyendo ahora, en la que veo que se puede invocar un método a la superclase que esté sobreescrito, lo cual me ha hecho caer en el detalle.
Es como si, al haber vuelto a declarar las variables matrícula y número de ruedas en la subclase, al hacer la llamada al constructor de Taxi con los 4 parámetros, los valores de matrícula y número de plazas se "machacaran", así que la solución pasaría por no declarar otra vez los atributos en la subclase, a los que sencillamente se puede acceder a través de sus métodos.

Libélula

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re:Duda ejercicio entrega CU00690B
« Respuesta #5 en: 12 de Mayo 2014, 22:03 »
O bien crear un constructor sin parámetros y luego al instanciar asignarle valores a los atributos a través de los setters.

javi in the sky

  • Avanzado
  • ****
  • Mensajes: 393
    • Ver Perfil
Re:Duda ejercicio entrega CU00690B
« Respuesta #6 en: 13 de Mayo 2014, 14:42 »
así que la solución pasaría por no declarar otra vez los atributos en la subclase, a los que sencillamente se puede acceder a través de sus métodos.

Si ves el ejemplo en CU00687B (https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=654:ejercicio-resuelto-ejemplo-de-herencia-simple-extends-y-super-en-java-constructores-con-herencia-cu00687b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188) las variables comunes se declaran en la superclase y no en la clase hija, como has indicado en tu mensaje creo que es lo correcto

Libélula

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re:Duda ejercicio entrega CU00690B
« Respuesta #7 en: 13 de Mayo 2014, 16:13 »
Sí, la verdad es que no tiene mucho sentido declarar de nuevo los atributos en la clase hija, cuando lo suyo es acceder a ellos a través de los métodos de la superclase, pero me pareció leer que el enunciado así lo pedía.
No obstante muchas gracias por molestarte en mirarlo y por tu ayuda.

 

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