Hola a todos, hoy os enseñare como se usa el operador instaceof en Java.
El operador instanceof nos permite comprobar si un objeto es de una clase concreta. Por ejemplo, tenemos 3 clases: Empleado (clase padre), Comercial (clase hija de Empleado) y Repartidor (clase hija Empleado).
public class EmpleadoApp { public static void main(String[] args) { Empleado empleados[]=new Empleado[3]; empleados[0]=new Empleado(); empleados[1]=new Comercial(); empleados[2]=new Repartidor(); for(int i=0;i<empleados.length;i++){ if(empleados[i] instanceof Empleado){ System.out.println("El objeto en el indice "+i+" es de la clase Empleado"); } if(empleados[i] instanceof Comercial){ System.out.println("El objeto en el indice "+i+" es de la clase Comercial"); } if(empleados[i] instanceof Repartidor){ System.out.println("El objeto en el indice "+i+" es de la clase Repartidor"); } } } }
Si ejecutas el ejemplo anterior, veras que cuando las clases hijas ademas de mostrar que es de su propia clase, también son de la clase Empleado, ya que, por ejemplo, un comercial «es un» empleado.
¿Pero que pasaría si quisiera ejecutar un método definido en la clase hija (en la clase padre no esta)? Debemos hacer un casting de objetos para poder ejecutarlo. Veamos un ejemplo:
public class EmpleadoApp { public static void main(String[] args) { Empleado empleados[]=new Empleado[4]; empleados[0]=new Comercial("Fernando", "Ureña", 23, 700, 50); empleados[1]=new Repartidor("Antonio", "Lopez", 30, 800, "Este"); empleados[2]=new Comercial("Laura", "Perez", 24, 1000, 30); empleados[3]=new Repartidor("Rosa", "Serrano", 43, 1200, "Oeste"); for(int i=0;i<empleados.length;i++){ //El array es de objetos Empleados if(empleados[i] instanceof Comercial){ //Si la posición del array es un comercial, hacemos un casting de objetos Comercial ref=(Comercial)empleados[i]; //Ahora podemos invocar métodos del objeto System.out.println("La comision es de "+ref.getComision()); } if(empleados[i] instanceof Repartidor){ //Si la posición del array es un repartidor, hacemos un casting de objetos Repartidor ref=(Repartidor)empleados[i]; //Ahora podemos invocar métodos del objeto System.out.println("La zona es "+ref.getZona()); } } } }
Como vemos, para hacer un casting de objetos, creamos un objeto aparte de la clase que queremos hacer el casting y convertimos la posición del array ya que el array considera que contiene objetos de la clase Empleado.
También debemos tener en cuenta que podemos usar una interfaz en lugar de una clase. Supongamos que tenemos la clase Empleado y otra clase Persona cada una con una interfaz llamada Empleable. Veamos un ejemplo:
public class EmpleadoApp { public static void main(String[] args) { /* * Hacemos un array de objetos, al ser distintas clases que * no tienen que ver, se usa la clase Object para almacenar * objetos */ Object objetos[]=new Object[4]; objetos[0]=new Empleado("Fernando", "Ureña", 23, 700); objetos[1]=new Persona("58654213R", 20); objetos[2]=new Empleado("Antonio", "Lopez", 30, 900); objetos[3]=new Persona("70588387F", 23); for(int i=0;i<objetos.length;i++){ //Si implementa la interfaz Empleable, entrara if(objetos[i] instanceof Empleable){ //Hacemos un casting de onjetos, pero en lugar de una clase usamos una interfaz. Empleable ref=(Empleable)objetos[i]; //Solo podra ejecutar los métodos que esten definidos en la interfaz System.out.println(ref.getEdad()); } } } }
Recuerda que si ese método esta tanto en la clase padre como en la hija, no es necesario hacer el casting de objetos.
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
Perfecto, no se puede explicar mejor, gracias! +10.
Que es un casting de objetos?
Es convertir un objeto a otro tipo de clase, solo funciona siempre y cuando sea compatible