Kako deluje Java operator instanceof
Z operacijo Java instanceof lahko preverite, ali objekt pripada določeni razred. Operacija vrne odgovor v obliki booleanske izjave, tj. »true« ali »false«. Če vnaprej preverite, ali se objekt in razred ujemata, lahko preprečite poznejša sporočila o napakah.
Kaj je instanceof v Javi?
Narava nekaterih spremenljivk v Javi ni vedno takoj očitna. V velikih Java projektih z več spremenljivkami lahko na primer vhodni podatki povzročijo, da se spremenljivka prikaže kot različni objekti. Zato programski jezik uporabnikom ponuja instanceof. Ta Java operator zagotavlja, da primerka referenčne spremenljivke res ustreza razredu, podrazredu ali vmesniku. Če obstaja ujemanje, operator izpiše logično vrednost »true«. Če ujemanja ni, je izpis »false«.
Pri pretvarjanju neznanega objekta je pomembno, da uporabite Java instanceof, da se prepričate, da objekt pripada predvideni razred. Če preskočite to varnostno preverjanje, se lahko pojavi ClassCastException. To se zgodi, ko je treba objekt pretvoriti v drug razred. Napaka je lahko zavajajoč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 referenčno spremenljivko s specifično razredom, ki ga prav tako določi uporabnik. Ne vključuje nobenih dodatnih informacij 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 operatorja 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 {
}javaNaslednji korak je razširitev te razreda s podrazredom imenovanim »Cat«.
public class Cat extends Animal {
}javaSedaj 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);
}
}javaIzhod naj bi bil takšen:
truejavaVeč ravni in razred Object
To načelo velja tudi za razred Main in druge podrazrede. 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ševnicama (//). To so komentarji v Javi. Pojasnjujejo 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 nadrazreda Animal. Zato je odgovor na obe vprašanji »true«. Ker je Object ali razred java.lang.Object na vrhu hierarhije, 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 ObjectjavaIzhod z vrednostjo null
Če ima spremenljivka vrednost null (tj. ne vsebuje objekta), Java operator instanceof samodejno izpiše »false«. Poglejmo, kako to deluje, na naslednjem 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");
}
}javaIzhod v tem primeru je:
cat2 is NOT an instance of CatjavaNadrazred/podrazred
Čeprav objekti v podrazredih pripadajo tudi ustreznim nadrazredom podrazredov, to ne velja v obratni smeri. Naslednji primer pomaga ponazoriti ta vidik hierarhije 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");
}
}javaIzhod v tem primeru je:
Bello is NOT an instance of CatjavaNapaka zaradi nezdružljivih tipov
Če med objektom in razredom ni povezave, se prikaže poročilo o napaki. Da bi to ponazorili, ustvarimo nov razred z imenom »Dog«, ki pripada nadrazredu 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);
}
}javaV 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 DogjavaV našem digitalnem vodniku boste našli še več zanimivih navodil in informativnih člankov o Javi. Najdete primerjavo med Javo in JavaScriptom ter med Javo in Pythonom. Izvedeli boste tudi več o bitnih operatorjih v Javi.
0b1dd7e3a0897fea2b000119fa7ad36e
8599808c2d8866e01ed62784504735aa
1fb255442559cd97917d248a8670dcfa
732d953cbb856e44160706a61b959638
4ddbfaa9819b0e6acceadc0e9799f762