Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Lorenzo31 en 19 de Abril 2015, 18:26
-
Buenas tardes, dejo la respuesta a mi ejercicio. Llevo tres días algo acatarrado de ahí mi ausencia :-)
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.
Pregunta a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
Respuesta No.
Pregunta b) ¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?
Respusta Si.
Pregunta c) Clase Vehiculo
/**
* Clase Vehiculo. Ejercicio 690B
*
* @author Lorenzo31
* @version 19.04.2015
*/
public class Vehiculo {
private String matricula;
private int numeroDeRuedas;
//Constructor
public Vehiculo(String matricula, int numeroDeRuedas){
this.matricula = matricula;
this.numeroDeRuedas = numeroDeRuedas;
}
//Setters
public void setMatricula(String matricula){ this.matricula = matricula; }
public void setNumeroDeRuedas(int numeroDeRuedas){ this.numeroDeRuedas = numeroDeRuedas; }
//Getters
public String getMatricula(){ return matricula; }
public int getNumeroDeRuedas(){ return numeroDeRuedas; }
//Método toString devuelve un String
public String toString(){ return ("La matricula del vehiculo es: " + matricula +
"\n El numero de ruedas es: " + numeroDeRuedas); }
}
Pregunta d) Clase Taxi
/**
* Clase Taxi extiende de Vehiculo. Ejercicio 690B
*
* @author Lorenzo
* @version 19.04.2015
*/
public class Taxi extends Vehiculo {
private String nombreDelConductor;
private int numeroDePlazas;
//Constructor
public Taxi(String matricula, int numeroDeRuedas, String nombreDelConductor, int numeroDePlazas){
super(matricula, numeroDeRuedas);
this.nombreDelConductor = nombreDelConductor;
this.numeroDePlazas = numeroDePlazas;
}
//Setters
public void setNombreDelConductor (String nombreDelConductor){ this.nombreDelConductor = nombreDelConductor; }
public void setNumeroDePlazas (int numeroDePlazas) { this.numeroDePlazas = numeroDePlazas; }
//Getters
public String getNombreDelConductor() { return nombreDelConductor; }
public int getNumeroDePlazas() { return numeroDePlazas; }
//Método toString
public String toString(){ return ("\n El nombre del conductor es: " + nombreDelConductor + "\n El numero de plazas es: " + numeroDePlazas); }
}
Pregunta e-1) Clase TestVehiculo1
/**
* Clase main ejecución ejercicio 690B
*
* @author Lorenzo31
* @version 19.04.2015
*/
public class TestVehiculo1 {
public static void main(String [] args) {
Vehiculo coche;
coche = new Taxi("B2345ELF",4,"Pedro Lopez", 5);
System.out.println(coche.toString());
}
}
Pregunta e-2) ¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi? ¿Por qué?
Respuesta El metodo toString() que se aplica es el propio de la clase Taxi, ya que en el momento de llamar a la función toString la instancia apunta a un objeto de tipo Taxi.
-
Hola Lorenzo31! la respuesta a la pregunta a) es que sí, aunque es un poco difícil de explicar. Puedes ver la explicación en https://www.aprenderaprogramar.com/foros/index.php?topic=1276.0
La pregunta b) está bien la respuesta, la c) también (clase Vehiculo)
En la d) (clase Taxi) te falta la invocación a super en el método toString. Al ser una relación de herencia hemos de tener en cuenta lo que se hereda de la clase padre. Si no invocas a super en el método toString() no se mostrará toda la información completa (mira que en el constructor sí invocas a super para tener en cuenta a la clase padre). Puedes verlo en https://www.aprenderaprogramar.com/foros/index.php?topic=1147.0
La pregunta e) está bien la respuesta
Saludos!!
-
Buenos días javi,
Primero gracias por tu respuesta, como siempre es un tiempo dedicado que se agradece infinito.
Empiezo por el final, basicamente puse el super.toString() pero como el ejercicio pedía que se viera que toString() concreto se ejecutaba, consideré a modo de test que era mas claro eliminarlo, así o solo se mostraba la info de Taxi o la de Vehiculos, en un ejercicio normal, hay que ponerlo sí o sí lo comprendo y es lógico.
Y sobre la pregunta
a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
Me mantengo ciñendome a lo que leo en ella que No. Una cosa es que, como señala Mario en el link que me has pasado, en un momento dado de la ejecución, el contenedor v1 (Vehiculo) albergue un Taxi y evidentemente, con un cast, al ser instanceof Taxi lo pase sin problemas.
Pero la pregunta especifica un objeto Vehiculo, entiendo que apunte a un Vehiculo, y por lo que he leído y entendido ni con un casting se puede pasar, pues da error;
Java.lang.ClassCastException.
Si estoy equivocado, repasaré de nuevo el tema 689. Yo lo entendíasí y supongo que el matiz que quereis se entienda es el "casting" de un Taxi dentro de Vehiculo es posible. Pero eso sigue siendo un Taxi :) no un objeto Vehiculo.
-
a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
Sobre este código lo que yo leería es esto:
public class test {
public static void main (String[] Args){
Vehiculo v1 = new Vehiculo();
Taxi t1 = new Taxi();
v1 = t1;
t1 = (Taxi)v1;
System.out.println("Ejecuta");
}
}
Vehiculo v1 = new Vehiculo(); : v1 es un objeto de tipo estático vehiculo y tipo dinamico Vehiculo
Taxi t1 = new Taxi(); : t1 es un objeto de tipo estático Taxi y tipo dinámico Taxi
v1 = t1; : v1, que tiene declarado tipo estático vehículo, pasa a tipo dinámico Taxi
t1 = (Taxi)v1; : t1, que tiene tipo estático Taxi, ahora sigue con tipo dinámico Taxi pero referencia al objeto v1, que tiene declarado tipo estático Vehiculo
¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
No podría contener a un objeto de tipo dinámico Vehiculo, pero sí a un objeto de tipo estático Vehiculo y tipo dinámico taxi.
Puede ser que me haya liado...
-
Buenas javi,
No, no te has liado, has resumido mejor que yo, lo que yo queria decir. Sí en ese caso lo veo así.
Yo solo matizaba que realmente en tiempo de ejecución,
v1 = t1; : v1, que tiene declarado tipo estático vehículo, pasa a (apuntar) a t1, tipo dinámico Taxi.
t1 = (Taxi)v1; : t1, que tiene tipo estático Taxi, ahora sigue con tipo dinámico Taxi pero referencia al objeto v1 que en tiempo de ejecucion apunta a Taxi, aunque tiene declarado tipo estático Vehiculo al empezar el programa.
De alguna manera mi respuesta seria NO, si v1 apunta a un Vehiculo, y sí si apunta en algun momento a un Taxi o subclase de Taxi, que a través de un casting se podría reReferenciar.
Gracias por las molestias y aclaraciones.