17. Operator instanceof

Java instanceof operator se koristi da testira da li je objekt instanca specificiranog tipa (klasa ili podklasa ili interfejs). Instanceof u javi je takođe poznat kao operator poređenja po tipu jer upoređuje instancu sa tipom. On vraća vrijednost true ili false. Ako primijenimo instanceof operator na bilo koju varijablu koja ima vrijednost null, on će vratiti false. Primjer1 za java instanceof operator Pogledajmo jednostavan primjer ovog operatora gdje on testira tekuću klasu.

class Simple1{  
 public static void main(String args[]){  
 Simple1 s=new Simple1();  
 System.out.println(s instanceof Simple); //true  
 }  
}

Ispis na ekranu:
true

Objekt tipa podklase je takođe tipa roditeljske klase. Na primjer, ako Dog nasljeđuje (extends) Animal tada objekt od Dog može da upućuje ili na Dog ili na Animal klasu. Primjer2 za java instanceof operator

class Animal{}  
class Dog1 extends Animal{ //Dog nasljeđuje Animal  
  
 public static void main(String args[]){  
 Dog1 d=new Dog1();  
 System.out.println(d instanceof Animal); //true  
 }  
}

Ispis na ekranu:
true

Operator instanceof sa varijablom koja ima vrijednost null Ako primijenimo instanceof operator sa varijablom koja ima vrijednost null, on će vratiti false. Pogledajmo takav primjer.

class Dog2{  
 public static void main(String args[]){  
  Dog2 d=null;  
  System.out.println(d instanceof Dog2); //false  
 }  
}

Ispis na ekranu:
false

Downcasting sa java instanceof operatorom Kada tip podklase upućuje na objekt roditeljske klase, to je poznato kao downcasting. Ako se to izvede direktno, kompajler će dati compile time error. Ako se to izvede pomoću typecastinga, biće izbačen ClassCastException u runtime-u. Ali ako koristimo instanceof operator, downcasting je moguć.

Dog d=new Animal(); //compile time error 

Ako izvedemo downcasting pomoću typecastinga, ClassCastException će biti izbačen u runtime.

Dog d=(Dog)new Animal(); //uspješno kompajlirano ali ClassCastException je izbačen u runtime-u

Napomena: Typecasting u Javi je dodjeljivanje jednog tipa, klase ili interfejsa, u drugi tip tj. drugu klasu ili interfejs. Napr. neka je Base superklasa, a Derived podklasa. Pogledajmo ovakav kod:

Base b = new Derived(); //referentna varijabla klase Base kreira objekt klase Derived
Derived d = b; //compile time error, potreban je typecasting
Derived d = (Derived) b; // typecasting Base u Derived

Mogućnost downcastinga sa instanceof Pogledajmo primjer, gdje je downcasting moguć pomoću instanceof operatora.

class Animal { }  
  
class Dog3 extends Animal {  
  static void method(Animal a) {  
    if(a instanceof Dog3){  
       Dog3 d=(Dog3)a; //downcasting  
       System.out.println("ok downcasting izveden");  
    }  
  }  
   
  public static void main (String [] args) {  
    Animal a=new Dog3();  
    Dog3.method(a);  
  }  
    
 }

Ispis na ekranu:
ok downcasting izveden

Downcasting bez upotrebe instanceof Downcasting se takođe može izvesti bez upotrebe instanceof operatora kao u sljedećem primjeru:

class Animal { }  
class Dog4 extends Animal {  
  static void method(Animal a) {  
       Dog4 d=(Dog4)a; //downcasting  
       System.out.println("ok downcasting izveden");  
  }  
   public static void main (String [] args) {  
    Animal a=new Dog4();  
    Dog4.method(a);  
  }  
}

Ispis na ekranu:
ok downcasting izveden

Razmotrimo ovo detaljnije, stvarni objekt koji je označen kao a, je objekt klase Dog. Ako ga downcastujemo, to je u redu. Ali šta će se desiti ako napišemo:

Animal a=new Animal();  
Dog.method(a); //sada imamo ClassCastException ali ne u slučaju instanceof operatora

Razumijevanje stvarne upotrebe operatora instanceof Pogledajmo stvarnu upotrebu ključne riječi instanceof u sljedećem primjeru.

interface Printable{}  
class A implements Printable{  
public void a(){System.out.println("a metoda");}  
}  
class B implements Printable{  
public void b(){System.out.println("b metoda");}  
}  
  
class Call{  
void invoke(Printable p){ //upcasting  
if(p instanceof A){  
A a=(A)p; //Downcasting   
a.a();  
}  
if(p instanceof B){  
B b=(B)p; //Downcasting   
b.b();  
}  
  
}  
} //kraj klase Call  
  
class Test4{  
public static void main(String args[]){  
Printable p=new B();  
Call c=new Call();  
c.invoke(p);  
}  
}

Ispis na ekranu:
b metoda

Objektno orijentisano programiranje u Javi    Index