Operador Instanceof en Java

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.

Compartir

3 comentarios

  1. Oscar

    Perfecto, no se puede explicar mejor, gracias! +10.

  2. Lovelace

    Que es un casting de objetos?

  3. Disco Duro de Roer Post author

    Es convertir un objeto a otro tipo de clase, solo funciona siempre y cuando sea compatible

Deja una respuesta

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