Autor Tema: Ejercicio! entrega CU00690B conversión de tipos hacia abajo java  (Leído 4444 veces)

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
SOBREESCRIBIR MÉTODOS EN JAVA. TIPO ESTÁTICO Y DINÁMICO. LIGADURA.
MÉTODOS POLIMÓRFICOS.

Citar
a) ¿Un objeto de tipo estático declarado Taxi puede contener a un objeto Vehiculo en tiempo de ejecución?
No. Considerando lo siguiente:

Vehiculo v1 = new Vehiculo(); //creamos un objeto de la super clase.

Taxi t1 = new Taxi(); //creamos un objeto de la subclase.

t1 = v1; //Error en compilación al tratar de hacer que la variable t1 apunte al objeto de v1.

t1 = (Taxi)v1; //La compilacion es posible gracias al "casting" pero en tiempo de ejecucion se optiene el siguiente error: java.lang.ClassCastException: CU00690B.Persona cannot be cast to CU00690B.Medico
Citar
b) ¿Un objeto de tipo estático declarado Vehiculo puede contener a un objeto Taxi en tiempo de ejecución?
Si. Considerando lo siguiente:
Vehiculo v2 = new Taxi(); //El codigo compila y se ejecuta sin errores.
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.
public class Vehiculo
Código: [Seleccionar]
public class Vehiculo
{
    private String matricula;
    private int numeroDeRuedas;
    public Vehiculo(String matricula, int numDeRuedas)
    {
      this.matricula = matricula;
      numeroDeRuedas = numDeRuedas;
    }
    //Setters
    public void setMatricula(String matricula)
    {
      this.matricula = matricula;
    }
    public void setNumeroDeRuedas(int numRuedas)
    {
      numeroDeRuedas = numRuedas;
    }
    //Getters
    public String getMatricula()
    {
      return matricula;
    }
    public int getNumeroDeRuedas()
    {
      return numeroDeRuedas;
    }
    //Otros metodos
    public String toString()
    {
      return "Matricula: " + matricula + "\nNumero de ruedas: " + numeroDeRuedas;
    }
}
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.
public class Taxi extends Vehiculo
Código: [Seleccionar]
public class Taxi extends Vehiculo
{
    private String nombreDelConductor;
    private int numeroDePlazas;
    public Taxi(String matricula, int numDeRuedas, String nombreDelConductor, int numDePlazas)
    {
      super(matricula, numDeRuedas);
      this.nombreDelConductor = nombreDelConductor;
      numeroDePlazas = numDePlazas;
    }
    //Setters
    public void setNombreDelConductor(String nombre)
    {
      nombreDelConductor = nombre;
    }
    public void setNumeroDePlazas(int numPlazas)
    {
      numeroDePlazas = numPlazas;
    }
    //Getters
    public String getNombreDelConductor()
    {
      return nombreDelConductor;
    }
    public int getNumeroDePlazas()
    {
      return numeroDePlazas;
    }
    //Otros metodos
    public String toString()   
    {
      return super.toString() + "\nNombre del conductor: " + nombreDelConductor + "\nNumero de plazas: " + numeroDePlazas;
    }
}
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().
public class Test
Código: [Seleccionar]
public class Test
{
    public static void main(String []args)
    {
      Vehiculo t1 = new Taxi("DC-2030", 4, "Jason Statham", 2);
      System.out.println("Datos del taxi numero 1:\n\n" + t1.toString());
    }
}
Citar
¿Qué método toString() resulta de aplicación, el propio de la clase Vehiculo o el propio de la clase Taxi?
Se ejecuta el metodo toString(); sobre escrito en la clase Taxi.
Citar
¿Por qué?
Aunque el objeto esta declarado como tipo Vehiculo en tiempo de ejecución el JVM se basa en su tipo dinamico (Taxi) y entonces comienza la búsqueda de este método a partir de la subclase Taxi, de no encontrar este método sobre escrito en la clase Taxi, entonces ejecutaría el método también sobre escrito de la clase Vehiculo, el resultado en esta ocasión y debido a la acción que se le indica realizar a este método sobre escrito de la clase Vehiculo, seria imprimir por pantalla un String que contiene el valor de sus únicos dos campos de clase. De no encontrar este método sobre escrito en la clase Vehiculo, entonces lo busca en la clase (Object) padre de todas las clases.

Como siempre sus comentarios correctivos son siempre bienvenidos.

Saludos!
« Última modificación: 08 de Septiembre 2014, 08:18 por Mario R. Rancel »
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Re:Ejercicio! entrega CU00690B conversión de tipos hacia abajo java
« Respuesta #1 en: 08 de Septiembre 2014, 08:19 »
Hola Sniper, he revisado el ejercicio y te dejo mis comentarios por si te sirven de ayuda.

Sobre la pregunta a): tu razonamiento es correcto, pero prueba el siguiente código.


Código: [Seleccionar]
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");
    }
}


Te remito a repasar CU00689B donde dice: Conversión hacia abajo (...) Esto no siempre es posible. El supertipo admite cualquier forma (es polimórfico) de los subtipos: si el supertipo almacena el subtipo al que queremos realizar la conversión, será posible usando lo que se denomina “Enmascaramiento de tipos” o “Hacer Casting” (cast significa “moldear”). Si el supertipo no almacena el subtipo al que queremos convertirlo, la operación no es posible y saltará un error. Ejemplo: ...

Razona tú mismo: ¿el objeto de tipo estático declarado Taxi en el código de ejemplo anterior contiene a un objeto Vehículo en tiempo de ejecución?

¿Responderías ahora sí a la pregunta?



Sobre la pregunta b): correcto.

Sobre la pregunta c): correcto.

Sobre la pregunta d): correcto.

Sobre la pregunta e): correcto. La cuestión del método toString: correcto, has hecho una buena interpretación de cómo java realiza la ligadura de métodos.

Saludos,

Jorge lopez

  • Sniper
  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 248
  • @SniperOfElite
    • Ver Perfil
Re:Ejercicio! entrega CU00690B conversión de tipos hacia abajo java
« Respuesta #2 en: 08 de Septiembre 2014, 23:00 »
Citar
Razona tú mismo: ¿el objeto de tipo estático declarado Taxi en el código de ejemplo anterior contiene a un objeto Vehículo en tiempo de ejecución?

¿Responderías ahora sí a la pregunta?

Ya lo he captado!

Para poder dar como respuesta, "SI" con relacion a el anterior codigo que utilice como ejemplo:
Citar
Vehiculo v1 = new Vehiculo(); //creamos un objeto de la super clase.

Taxi t1 = new Taxi(); //creamos un objeto de la subclase.

t1 = v1; //Error en compilación al tratar de hacer que la variable t1 apunte al objeto de v1.

t1 = (Taxi)v1; //La compilacion es posible gracias al "casting" pero en tiempo de ejecucion se optiene el siguiente error: java.lang.ClassCastException: CU00690B.Persona cannot be cast to CU00690B.Medico

es necesario realizar una conversion de tipos hacia abajo (que un objeto Vehiculo pase a almacenar un objeto Taxi)
mediante una sintaxis como v1 = t1; y luego hacer que t1 almacene un objeto v1 mediante un "Casting"
t1 = (Taxi)v1;

y aqui es donde entra tu codigo de ejemplo  Mario:
Código: [Seleccionar]
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");
    }
}

En este punto, cambio mi respuesta a la pregunta a) y contesto SI, gracias al "Casting" de tu comentario Mario ;D

Muchas gracias.

Saludos!
while(estesVivo)
{
  aprende();
  ayuda();
  enseña();
}
if(mueres){teRecordaran();}

 

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