– Cześć, Amigo! Spotkałeś się już z operatorem instanceof. Operator instanceof to proste w użyciu oraz wydajne narzędzie. Opowiem ci dzisiaj, jak i kiedy można je stosować.

Brzmi jak reklama!

– To bardzo proste. Używamy go w następujący sposób: «obiekt» instanceof «klasa».

Jego zadaniem jest sprawdzanie, czy obiekt stanowi instancję określonej klasy. W praktyce jest to dużo prostsze, niż się wydaje. Spójrz na ten przykład:

Kod Opis
Object o = new Integer(3);
boolean isInt = o instanceof Integer;
isInt będzie true. Obiekt, do którego odnosi się zmienna o, jest instancją klasy Integer.
Object o = "Mama";
boolean isInt = o instanceof Integer;
isInt będzie false. Obiekt, do którego odnosi się zmienna o, nie jest instancją klasy Integer. To obiekt typu String.
InputStream is = new FileInputStream("");
boolean isFIS = is instanceof FileInputStream;
isFIS będzie true. Obiekt, do którego odnosi się zmienna is, jest instancją klasy FileInputStream.

Tak, to rzeczywiście bardzo proste.

– Operator ten bierze także pod uwagę dziedziczenie. Sprawdź, jak to działa.

Kod Opis
class Animal
{
}
class Cat extends Animal
{
}
class Tiger extends Cat
{
}
Mamy tutaj deklaracje trzech klas: Animal, Cat oraz Tiger. Cat dziedziczy Animal. Za to Tiger dziedziczy Cat.
Object o = new Tiger();
boolean isCat = o instanceof Cat;
boolean isTiger = o instanceof Tiger;
boolean isAnimal = o instanceof Animal;
isCat będzie true.
isTiger będzie true.
isAnimal będzie true.
Object o = new Animal();
boolean isCat = o instanceof Cat;
boolean isTiger = o instanceof Tiger;
boolean isAnimal = o instanceof Animal;
isCat będzie false.
isTiger będzie false.
isAnimal będzie true.

I podobnie z interfejsami:

Kod Opis
interface Moveable
{
}
class Cat
{
}
class TomCat extends Cat implements Moveable
{
}
Stwórz dwie klasy: Cat, TomCat oraz interfejs Moveable
Cat o = new TomCat();
boolean isCat = o instanceof Cat;
boolean isMoveable = o instanceof Moveable;
boolean isTom = o instanceof TomCat;
isCat będzie true.
isMoveable będzie true.
isTom będzie true.
Cat o = new Cat();
boolean isCat = o instanceof Cat;
boolean isMoveable = o instanceof Moveable;
boolean isTom = o instanceof TomCat;
isCat będzie true.
isMoveable będzie false.
isTom będzie false.

Z operatora instanceof korzystamy w następujący sposób: a instanceof B.

Oznacza to, że operator instanceof zwróci true, jeśli:

1) zmienna a przechowuje referencję do obiektu typu B

2) zmienna a przechowuje referencję a do obiektu, którego klasa dziedziczy B

3) zmienna a przechowuje referencję a do obiektu, który implementuje interfejs B

W każdym innym przypadku operator instanceof zwróci false.

– Kumam. Ale dlaczego jest to konieczne, wujku Raszi?

– Basia Ci o tym dzisiaj opowie. To naprawdę przydatny operator. Sam za chwilę się o tym przekonasz.