Z operacijo Java instanceof lahko preverite, ali objekt pripada določeni razred. Operacija vrne odgovor v obliki boo­le­an­ske izjave, tj. »true« ali »false«. Če vnaprej preverite, ali se objekt in razred ujemata, lahko pre­pre­či­te poznejša sporočila o napakah.

Kaj je instanceof v Javi?

Narava nekaterih spre­men­ljivk v Javi ni vedno takoj očitna. V velikih Java projektih z več spre­men­ljiv­ka­mi lahko na primer vhodni podatki pov­zro­či­jo, da se spre­men­ljiv­ka prikaže kot različni objekti. Zato pro­gram­ski jezik upo­rab­ni­kom ponuja instanceof. Ta Java operator za­go­ta­vlja, da primerka re­fe­renč­ne spre­men­ljiv­ke res ustreza razredu, po­d­ra­zre­du ali vmesniku. Če obstaja ujemanje, operator izpiše logično vrednost »true«. Če ujemanja ni, je izpis »false«.

Pri pre­tvar­ja­nju neznanega objekta je pomembno, da uporabite Java instanceof, da se pre­pri­ča­te, da objekt pripada pred­vi­de­ni razred. Če pre­sko­či­te to varnostno pre­ver­ja­nje, se lahko pojavi Clas­sCa­stExcep­ti­on. To se zgodi, ko je treba objekt pre­tvo­ri­ti v drug razred. Napaka je lahko za­va­ja­jo­ča in lahko povzroči težave, če je koda posebej dolga. Zato je najbolje, da za zaščito že na začetku uporabite Java instanceof.

Kakšna je sintaksa za instanceof?

Ko v Javi uporabite instanceof, operator primerja re­fe­renč­no spre­men­ljiv­ko s spe­ci­fič­no razredom, ki ga prav tako določi uporabnik. Ne vključuje nobenih dodatnih in­for­ma­cij o naravi objekta ali razreda. Preprosto ugotovi, ali obstaja ujemanje ali ne. Sintaksa je preprosta in izgleda takole:

(object) instanceof (class)
java

Če je (object) primer (class), se prikaže »true«. Če to ni primer, se prikaže »false«.

Primeri instanceof ope­ra­tor­ja v Javi

Najprej vam bomo pokazali kratek primer, ki prikazuje, kako deluje instanceof v Javi. Tukaj bomo ustvarili razred z imenom »Animal«.

public class Animal {
}
java

Naslednji korak je raz­ši­ri­tev te razreda s po­d­ra­zre­dom ime­no­va­nim »Cat«.

public class Cat extends Animal {
}
java

Sedaj lahko z Java instanceof preverimo, ali primerka Cat pripada razredu Animal. Za to bomo napisali še nekaj vrstic kode in izpisali rezultat z Java ukazom System.out.println:

public class Animal {}
public class Cat extends Animal {
public static void main(String args []{
Cat cat = new Cat();
System.out.println(cat instanceof Animal);
}
}
java

Izhod naj bi bil takšen:

true
java

Več ravni in razred Object

To načelo velja tudi za razred Main in druge po­d­ra­zre­de. Naslednji primer vsebuje več ravni, operater instanceof v Javi pa smo razširili z if-else. Morda boste opazili nekaj dodatnega besedila za dvema po­šev­ni­ca­ma (//). To so ko­men­tar­ji v Javi. Po­ja­snju­je­jo posamezne korake, vendar ne vplivajo na izhod.

// Class 1
// Superclass
public class Animal {
}
// Class 2
// Subclass
class Cat extends Animal {
}
// Class 3
// Main class
class Main {
public static void main(String[] args)
Cat cat1 = new Cat();
if (cat1 instanceof Cat)
	System.out.println ("cat1 is an instance of Cat");
else
	System.out.println ("cat1 is NOT an instance of Cat");
if (cat1 instanceof Animal)
	System.out.println ("cat1 is an instance of Animal");
else
	System.out.println ("cat1 is NOT an instance of Animal");
if (cat1 instanceof Object)
	System.out.println ("cat1 is an instance of Object");
else
	System.out.println ("cat1 is NOT an instance of Object");
	}
}
java

Če pogledamo naš primer, vidimo, da je cat1 primer razreda Cat in nad­ra­zre­da Animal. Zato je odgovor na obe vprašanji »true«. Ker je Object ali razred java.lang.Object na vrhu hi­e­rar­hi­je, je cat1 tudi primer Object. Zato bo operator Java instanceof vedno izpisal true, ko se uporabi z razredom Object. Izpis je takšen:

cat1 is an instance of Cat
cat1 is an instance of Animal
cat1 is an instance of Object
java

Izhod z vre­dno­stjo null

Če ima spre­men­ljiv­ka vrednost null (tj. ne vsebuje objekta), Java operator instanceof samodejno izpiše »false«. Poglejmo, kako to deluje, na na­sle­dnjem primeru:

class Cat {
}
class Main {
public static void main(String[] args)
{
Cat cat2 = null;
if (cat2 instanceof Cat)
	System.out.println ("cat2 is an instance of Cat");
else
	System.out.println ("cat2 is NOT an instance of Cat");
	}
}
java

Izhod v tem primeru je:

cat2 is NOT an instance of Cat
java

Nadrazred/podrazred

Čeprav objekti v po­d­ra­zre­dih pripadajo tudi ustreznim nad­ra­zre­dom po­d­ra­zre­dov, to ne velja v obratni smeri. Naslednji primer pomaga po­na­zo­ri­ti ta vidik hi­e­rar­hi­je razredov:

class Animal {
}
class Cat extends Animal {
}
class Main {
public static void main(String[] args)
{
Animal bello = new Animal ();
if (bello instanceof Cat)
	System.out.println ("Bello is an instance of Cat");
else
	System.out.println ("Bello is NOT an instance of Cat");
	}
}
java

Izhod v tem primeru je:

Bello is NOT an instance of Cat
java

Napaka zaradi ne­zdru­žlji­vih tipov

Če med objektom in razredom ni povezave, se prikaže poročilo o napaki. Da bi to po­na­zo­ri­li, ustvarimo nov razred z imenom »Dog«, ki pripada nad­ra­zre­du Animal, vendar nima povezave z razredom Cat.

class Dog extends Animal {
}
class Main {
public static void main(String[] args)
{
Cat cat3 = new Cat ();
System.out.println (cat3 instanceof Dog);
	}
}
java

V tem primeru bomo prejeli sporočilo o napaki, ki nam bo sporočilo, da med razredoma Cat in Dog ni povezave. Sporočilo je videti takole:

java.lang.Error: Unresolved compilation problem:
Incompatible conditional operand types Cat and Dog
java
Tip

V našem di­gi­tal­nem vodniku boste našli še več zanimivih navodil in in­for­ma­tiv­nih člankov o Javi. Najdete pri­mer­ja­vo med Javo in Ja­va­Scrip­tom ter med Javo in Pythonom. Izvedeli boste tudi več o bitnih ope­ra­tor­jih v Javi.

0b1dd7e3a0897fea2b000119fa7ad36e

8599808c2d8866e01ed62784504735aa

1fb255442559cd97917d248a8670dcfa

732d953cbb856e44160706a61b959638

4ddbfaa9819b0e6acceadc0e9799f762

Go to Main Menu