Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado 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.
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;
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.
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
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
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
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
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
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.
-
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.
-
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