Java - instanceof operator


U Javi je ključna riječ instanceof binarni operator. Koristi se za provjeru da li objekt instanca određene klase ili nije. Operator takođe provjerava da li objekt instanca klase koja implementuje interfejs (o tome će biti riječi kasnije u ovoj lekciji). Sintaksa instanceof je:

result = objectName instanceof className;

Lijevi operand instanceof operatora je ime objekta, a desni operativni naziv klase. Rezultat će biti istinit (true) ako je objekt instanca klase i netačan (false) ako nije.


Primjer 1: instanceof

class Main {
    public static void main (String[] args) {
        String name = "IT TUTORIJALI";
        Integer age = 22;

        System.out.println("Da li je ime instanca Stringa: "+ (name instanceof String));
        System.out.println("Su godine - primjer cijelog broja: "+ (age instanceof Integer));
    }
}

U gornjem primjeru stvorili smo ime objekta tipa String i objekat age tipa Integer. Zatim smo koristili operator instanceof da provjerimo da li ime tipa String, a age tipa Integer.



Upotreba instanceof u nasljeđivanju

U slučaju nasljeđivanja, operator instanceof se koristi za provjeru da li je objekt podklase ujedno i instanca superklase.


Primjer 2: instanceof u nasljeđivanju

class Animal {
}

// Dog klasa je potklasa of Animal
class Dog extends Animal {
}

class Main {
    public static void main(String[] args){
        Dog d1 = new Dog();

        // provjerava da li je d1 objekt Dog
        System.out.println("Da li je d1 instanca Dog: "+ (d1 instanceof Dog));
       
        // checks if d1 is an object of Animal
        System.out.println("Da li je d1 instanca Animal: "+ (d1 instanceof Animal));
    }
}

U gornjem primjeru, d1 je instanca i pasa (Dog) i klase životinja (Animal). Dakle, i d1 instanca pasa (Dog) i d1 instanca životinje (Animal) rezultuju tačno.



Klasa objekta (Object Class)

U Javi su sve klase naslijeđene od klase Object. Ključna riječ extends ne koristi se za vrijeme nasljeđivanja klase Object. Ovo se nasljeđivanje događa implicitno u Javi.


Primjer 3: Klasa objekta (Object Class)

class Animal {
}

class Dog {
}

class Cat {
}
class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = new Animal();
        Cat c1 = new Cat();

        System.out.println("Da li je d1 instanca Object class: "+ (d1 instanceof Object));
        System.out.println("Da li je a1 instanca Object class: "+ (a1 instanceof Object));
   
        System.out.println("Da li je c1 instanca Object class: "+ (c1 instanceof Object));
    }
}

U gornjem primjeru stvorili smo objekte a1, d1 i c1 klasa Animal, Dog i Cat, respektivno. Koristili smo operator instanceof da provjerimo jesu li ovi objekti a1, d1 i c1, takođe objekti klase Object. Rezultati su tačni (true) za sve. To je zato što je klasa Object korijenska klasa definisana u paketu java.lang. Sve ostale klase su podređene klase klase Object koje čine hijerarhiju u Javi.



Unapređivanje i spuštanje objekata

U Javi se objekt podklase može tretirati kao objekt superklase. To se naziva upcasting. Java kompajler automatski izvodi nadogradnju.


Primjer 4: Ažuriranje objekata

class Animal {
    public void displayInfo() {
        System.out.println("Ja volim životinje.");
    }
}

class Dog extends Animal {
}

class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = d1;
        a1.displayInfo();
    }
}

U gornjem primjeru stvorili smo objekt d1 klase Dog. Taj objekt d1 koristimo za stvaranje objekta a1 klase Animal. To se u Javi naziva upcasting. Kod se izvršava bez ikakvih problema. To je zato što ažuriranje automatski rade Java kompajleri. Downcasting je obrnuti postupak nadogradnje. U slučaju spuštanja prema dole, objekt superklase tretira se kao objekt podklase. Moramo izričito uputiti kompajleru da spusti Javu.


Primjer 5: Problem spuštanja objekata

class Animal {
}

class Dog extends Animal {
   public void displayInfo() {
       System.out.println("Ja sam pas.");
   }
}

class Main {
   public static void main(String[] args) {
       Animal a1 = new Animal();
       Dog d1 = (Dog)a1; // Downcasting
 
       d1.displayInfo();
   }
}

Kada pokrenemo program, dobićemo izuzetak nazvan ClassCastException. Da vidimo šta će se ovde dogoditi. Ovdje smo stvorili objekt a1 superklase Animal. Zatim smo pokušali prebaciti objekt a1 na objekt d1 podklase Dog.

To je uzrokovalo problem. To je zato što se objekt a1 superklase Animal može odnositi i na druge podklase. Da smo zajedno s podklasom Dog stvorili još jednu podklasu Cat. Životinja možda da bude mačka ili možda pas i izaziva dvosmislenost. Da bismo riješili ovaj problem, možemo koristiti operator instanceof. Evo kako:


Primjer 6: Rješavanje downcastinga pomoću instanceof

class Animal {
}

class Dog extends Animal {
  public void displayInfo() {
     System.out.println("Ja sam pas.");
  }
}

class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    Animal a1 = d1;    // Upcasting

    if (a1 instanceof Dog){
       Dog d2 = (Dog)a1;    // Downcasting
       d2.displayInfo();
    }
  }
}

U gornjem primjeru koristimo operator instanceof da provjerimo da li je objekt a1 instanca klase Dog ili nije. Spuštanje prema dole vrši se samo kada je izraz a1 instance Dog istinit (true).



instanceof u interfejsu

Operator instanceof se takođe koristi za provjeru da li je objekt klase takođe instanca interfejsa odakle se klasa implementuje.


Primjer 7: instanceof u interfejsu

interface Animal {
}

class Dog implements Animal {
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      System.out.println("Da li je d1 instanca Animal: "+(d1 instanceof Animal));
   }
}

U gornjem primjeru stvorili smo klasu Dog koja implementuje interfejs Animal. Zatim smo kreirali d1 objekt klase Dog. Koristili smo operator instanceof da provjerimo da li je objekt d1 takođe instanca interfejsa Animal.