lunes, 7 de mayo de 2012

Casteos


Definición:
      El casteo (casting) es un procedimiento para transformar una variable primitiva de un tipo a otro, o transformar un objeto de una clase a otra clase siempre y cuando haya una relación de herencia  entre ambas.
      Existen distintos tipos de casteo (casting) de acuerdo a si se utilizan tipos de datos o clases.

Casteo Implícito (Widening Casting)
      El casteo implícito radica en que no se necesita escribir código para que se lleve a cabo. Ocurre cuando se realiza una conversión ancha – widening casting – es decir, cuando se coloca un valor pequeño en un contenedor grande.
      Ejemplo:
               
                //Define una variable de tipo int  con el valor 100
                int numeroEntero = 100;
                //Define una variable de tipo long a partir de un int
                long numeroLargo = numero;

Casteo Explicito (Narrowing Casting)
      El casteo explicito se produce cando se realiza una conversión estrecha – narrowing casting – es decir, cuando se coloca un valor grande en un contenedor pequeño. Son susceptibles de perdida de datos y deben realizarse a través de código fuente, de forma explicita.
      Ejemplo:
               
                //Define una variable del tipo int con el valor 250
                int numeroEntero = 250;
                //Define una variable del tipo short y castea la variable numero
                short s = (short) numero;

Upcasting

El upcasting se produce a nivel objetos. Suponiendo que existe una clase Empleado y clase Ejecutivo, la cual es una subclase de esta. Un Ejecutivo entonces ES UN Empleado y se puede escribir de la siguiente forma:
     
      //Instancia un ejecutivo en una variable de tipo Empleado
      Empleado e1 = new Ejecutivo (“Maximo Dueño”, 2000);

A esta operación en donde un objeto de una clase derivada se asigna a una referencia cuyo tipo es alguna de las superclases se la denomina upcasting.
Cuando se realiza este tipo de operaciones, hay que tener cuidado porque para la referencia e1 no existen los atributos y métodos que se definieron en la clase Ejecutivo, aunque la referencia apunte a un objeto de este tipo.
Por el contrario, si ahora existe una variable de tipo Empleado y se desea acceder a los métodos de la clase derivada – suponiendo  que contiene un método ejecutarPlanificacion() en la clase Ejecutivo – teniendo una referencia de una clase base, como en el ejemplo anterior, hay que convertir explícitamente la referencia de un tipo  a otro. Esto se hace con el operador de cast de la siguiente forma:

      //Instancia un ejecutivo en una variable de tipo Empleado
      Empleado emp = new Ejecutivo (“Máximo Dueño”, 2000);

      //Se convierte (o castea) la referencia de tipo
      Ejecutivo ej = (Ejecutivo) emp;

      //Usamos el método de la clase Ejecutivo
      ej.ejecutarPlanificacion();

La expresión de la segunda línea convierte la referencia de tipo Empleado asignándola a una referencia de tipo Ejecutivo. Para el compilador es correcto porque Ejecutivo es una clase derivada de Empleado. En tiempo de ejecución la JVM convertirá la referencia si efectivamente emp apunta a un objeto de la clase Ejecutivo, caso contrario lanzara una excepción.
Por el contrario, si intenta realizar lo siguiente:

      Empleado emp = new Empleado (“Mario Gómez”, 2000);
      Ejecutivo ej = (Ejecutivo) emp;

No dará problemas de compilación, pero al ejecutar se pero al ejecutar se producirá un error ya que la referencia emp apunta a un objeto de la clase Empleado y no a un objeto de clase Ejecutivo.

17 comentarios:

  1. Puede ser que yayas querido decir esto:

    //Instancia un ejecutivo en una variable de tipo Empleado
    Empleado emp = new Ejecutivo (“Máximo Dueño”, 2000);


    ResponderEliminar
  2. puede que hayas querido decir hayas..

    ResponderEliminar
  3. puede que hayas queri decir mayas xD

    ResponderEliminar
  4. puede que hayas querido decir querido

    ResponderEliminar
  5. Querido decime que me saco la maya?..como es eso?

    ResponderEliminar
  6. Tomaos algo,porque lo que quiero decir es que digo lo que digo

    ResponderEliminar
  7. Amarra la jaca a la verja,Mohamed.O Átala de una vez.

    ResponderEliminar
  8. //Define una variable de tipo int con el valor 100
    int numeroEntero = 100;
    //Define una variable de tipo long a partir de un int
    long numeroLargo = numero;

    el error: long numeroLargo=numeroEntero; saludos

    ResponderEliminar
  9. Se equivocó el boludo acá:

    //Instancia un ejecutivo en una variable de tipo Empleado
    Empleado e1 = new Ejecutivo (“Máximo Dueño”, 2000);


    //Se convierte (o castea) la referencia de tipo
    Ejecutivo ej = (Ejecutivo) emp;


    //Usamos el método de la clase Ejecutivo
    ej.ejecutarPlanificacion();



    Sería así:

    //Instancia un ejecutivo en una variable de tipo Empleado
    Empleado emp = new Ejecutivo (“Máximo Dueño”, 2000);


    //Se convierte (o castea) la referencia de tipo
    Ejecutivo ej = (Ejecutivo) emp;


    //Usamos el método de la clase Ejecutivo
    ej.ejecutarPlanificacion();


    ResponderEliminar
  10. vine por el casteo relacionando clases con implementacions de interfaces y me fui con las manos vacias, igual sirve..

    ResponderEliminar
  11. Hla es cierto lo de el meteorito=???? parenlo porfavor solo tengo 11 años aganlo porfavoooor T_T

    ResponderEliminar
  12. Como puedo castear una variable de tipo double que es matriz , a otra que es double pero que no es matriz?

    ResponderEliminar