Casting de objetos en Java

Hola a todos, hoy os voy a explicar como podemos hacer casting de objetos.

Ya vimos el tema del casting entre tipos primitivos, en objetos tambien podemos hacer castings.

Igual que en el de tipos, los objetos deben ser compatibles entre sí, por ejemplo una clase hija y una clase padre.

La mayor utilidad de los castings de objetos es cuando necesitamos que sea de un objeto en concreto, ya que si es del tipo de la clase padre, no podrá llamar a los métodos propios de la clase hija.

Veamos nuestras clases:

Empleado


public class Empleado {

    protected String nombre;
    protected String apellido;
    protected int edad;
    protected double salario;

    public Empleado(String nombre, String apellido, int edad, double salario) {
        this.nombre = nombre;
        this.apellido = apellido;
        this.edad = edad;
        this.salario = salario;
    }

    public Empleado(String nombre, String apellido, int edad) {
        this.nombre = nombre;
        this.apellido = apellido;
        this.edad = edad;

    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public double getSalario() {
        return salario;
    }

    public void setSalario(double salario) {
        this.salario = salario;
    }

    @Override
    public String toString() {
        return "Empleado{" + "nombre=" + nombre + ", apellido=" + apellido + ", edad=" + edad + ", salario=" + salario + '}';
    }

    public boolean plus(double plus) {
        boolean aumento = false;
        if (edad > 40) {
            salario += plus;
            aumento = true;
        }
        return aumento;
    }

}

Comercial


public class Comercial extends Empleado{
 
    private double comision;
 
    public Comercial(String nombre, String apellido, int edad, double salario, double comision) {
        super(nombre, apellido, edad, salario);
        this.comision=comision;
    }
    
    @Override
    public boolean plus(double plus) {
        boolean aumento = false;
        if (edad > 40 && comision>200) {
            salario += plus;
            aumento = true;
        }
        return aumento;
    }
    
    public void metodoComercial(){
        System.out.println("Estoy en la clase comercial");
    }
}

Repartidor


public class Repartidor extends Empleado {

    private String zona;

    public Repartidor(String nombre, String apellido, int edad, double salario, String zona) {
        super(nombre, apellido, edad, salario);
        this.zona = zona;
    }
    
    @Override
    public boolean plus(double plus) {
        boolean aumento = false;
        if (edad > 40 && zona.equals("zona 3")) {
            salario += plus;
            aumento = true;
        }
        return aumento;
    }
    
    public void metodoRepartidor(){
        System.out.println("Estoy en la clase repartidor");
    }
}

Clase ejecutable


public class Casting_objetos {

    public static void main(String[] args) {
        Comercial e1 = new Comercial("fer", "ure", 60, 1000, 150);
        Repartidor e2 = new Repartidor("fer", "ure", 50, 1000, "zona 3");
        Empleado e3 = new Empleado("fer", "ure", 42, 1000);

        Empleado[] empleados = {e1, e2, e3};

        Comercial c1;
        Repartidor r1;
        
        for (Empleado e : empleados) {
        
            if(e instanceof Comercial){
                c1 = (Comercial)e;
                c1.metodoComercial();
            }
            if(e instanceof Repartidor){
                r1 = (Repartidor)e;
                r1.metodoRepartidor();
            }
        }
    }
    
}

Fijaros en las clases Repartidor y Comercial, les he puesto un método que es único en cada uno. Bien, ahora mira en la clase ejecutable y fijate que meto 3 objetos en un array Empleado, cada uno de ellos ahora estan enmascarados como si fuera un Empleado por lo que no podran llamar a ese método único.

Dentro del bucle, uso instanceof para asegurme que el objeto sea del tipo que yo quiero castear. Si lo es puedo hacer el casting sin problemas:


//Nos aseguramos de que sea del tipo Comercial
if(e instanceof Comercial){
      c1 = (Comercial)e; //Casting a comercial
      c1.metodoComercial(); //Ahora puedo llamar al metodo
}

Como resumen, los casting son útiles cuando queremos llamar a métodos propios de un objeto que esta en otra clase compatible. Por último, te recomiendo utilizar polimorfismo para evitar en todo lo posible el casting, siempre que se pueda.

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

¿Te ha gustado y quieres apoyarme? ¡Sé mi patrón!
Etiquetas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *