Cómo utilizar instanceof en Java 8

¬ŅSabes c√≥mo utilizar instanceof en Java 8? Con esta entrada comienzo una larga serie que va a abarcar todo el material que entra en el examen OCP de Oracle.

More...

La idea es ir prepar√°ndomelo a medida que publico las entradas, as√≠ voy aprendiendo sobre la marcha, y t√ļ te puedes beneficiar de todas las explicaciones que yo te de aqu√≠ ūüôā . Ya he escrito antes una entrada sobre material que entra en el examen (en concreto, el art√≠culo sobre el m√©todo toString()), pero a partir de ahora lo har√© de manera sistem√°tica.

C√≥mo utilizar instanceof en Java: ¬Ņqu√© es instanceof?

instanceof es una palabra clave que significa, literalmente, instancia de. Sí, se escribe sin espacio.

Ya solo con esto puedes tener una pista de para qué se utiliza; básicamente, su función es la de determinar si el objeto al que apunta una referencia dada es una instancia de una clase o interfaz concretas. Así, instanceof devuelve un valor booleano (true/false, verdadero o falso).

Partes de instanceof en Java

Dicho lo anterior, instanceof consta de tres partes:

  • Una referencia (nunca una variable primitiva).
  • La palabra clave instanceof.
  • El nombre de la clase o interfaz de la que queremos comprobar si el objeto al que apunta la referencia utilizada es una instancia.

Ejemplo de uso de instanceof en Java

Uso de instanceof con clases

Ya basta de tanta letra, y pasemos al código. En primer lugar, comenzaremos con cómo utilizar instanceof en Java con instancias de una clase:

El objeto al que apunta la referencia perro es una instancia de la clase Perro, que hereda de la clase Animal. Entonces, el objeto al que apunta perro es una instancia también de la clase Animal. Por ello, el resultado es true.

Vaya, que toda instancia de la clase Perro es también una instancia de la clase Animal, porque todo Perro es un Animal.

Hasta ahora todo parece f√°cil, ¬Ņno? Si el objeto al que apunta la referencia es una instancia de la clase, instanceof devuelve true. Me imagino que habr√°s observado que hablo continuamente de "el objeto al que apunta la referencia", y no de la referencia en s√≠. Esto se debe a que la referencia en s√≠ no es nada; es como un hilo que nos lleva al objeto. La referencia en s√≠ no es instancia de nada. Esto te tiene que quedar muy claro, porque es posible que, de otro modo, pienses que instanceof devuelva siempre el valor true si se utiliza la referencia perro que aparece m√°s arriba. Nada m√°s lejos de la realidad:

Como ves, la referencia perro no apunta a ning√ļn objeto (null), y null no es instancia de nada.

null no es instancia de nada: devuelve false

El otro caso en el que instanceof devuelve false es cuando se utiliza una referencia de una superclase. Quedar√° m√°s claro con un ejemplo:

Uso de instanceof en Java

Esta m√°quina de matar es tambi√©n un Animal, como t√ļ o yo

En este caso, instanceof devuelve false porque la referencia es de tipo Animal, y puede apuntar tanto a un objeto de tipo Perro, como de tipo Gato. Quiz√° te digas "ya, lo he entendido, ¬Ņqu√© otra cosa podr√≠a hacer instanceof?". La respuesta es muy f√°cil: podr√≠a no compilar.

Recuerda: instanceof solo devuelve false en dos casos


La raz√≥n es sencilla: cuando se utiliza una clase, como en este caso, instanceof solo devuelve false en dos casos:

  • Cuando la referencia no apunta a ning√ļn objeto (valor null).
  • Cuando la referencia es de una superclase. Es decir, tienes una referencia de tipo Animal, que podr√≠a ser un Perro o un Gato.   

En el resto de ocasiones, o el valor es true, o el código no compila. En realidad, puedes entenderlo de este modo: el código solo compila si el valor de instanceof es true. Si existen estas dos excepciones, es porque el compilador no sabe si la referencia es null, o a qué tipo de subclase apunta. Incluso si marcas la referencia como final, el código compila y devuelve false.

Si el objeto al que apunta la referencia ni es un Animal ni puede serlo, el código no compila:

Uso de instanceof con interfaces

En este caso, el uso de instanceof con interfaces es el mismo que con clases, con una peque√Īa diferencia: instanceof siempre compila. Cuando se utiliza instanceof, si el objeto al que apunta la referencia robot no es y no puede ser un objeto de clase Animal, ya que la clase Robot no la extiende, el compilador lo ve y detiene la compilaci√≥n con un error.

En cambio, cuando se trata de una interfaz, el compilador no lo tiene tan claro. Veamos el siguiente ejemplo:

Si antes la clase Perro no pod√≠a ser una subclase de la clase Gato, ya que ambas extienden la clase Animal, en este caso es posible instanciar una referencia de la clase Robot, que no implementa la interfaz Blindaje, pero que apunte a un objeto cuyo tipo sea una subclase, Soldado, que s√≠ lo implementa. Recuerda que una clase solo puede extender una clase, pero puede implementar un n√ļmero ilimitado de interfaces. Como el compilador no puede distinguir uno de otro, permite que el c√≥digo compile y que instanceof realice su labor.

En conclusión: cómo utilizar instanceof

  • Si se utiliza instanceof con una interfaz, siempre compila.
  • Si se utiliza instanceof con una clase, solo devuelve false en dos casos. En el resto de casos, o devuelve true, o no compila.

Deja una respuesta 0 comentarios

Utilizamos cookies propias y de terceros para realizar el an√°lisis de la navegaci√≥n de los usuarios y mejorar nuestros servicios. Si contin√ļa navegando, consideramos que acepta su uso. Puede cambiar la configuraci√≥n u obtener m√°s informaci√≥n en nuestra pol√≠tica de cookies. ACEPTAR

Aviso de cookies