Ako funguje operátor instanceof v jazyku Java
Pomocou operátora Java instanceof môžete skontrolovať, či objekt patrí do konkrétnej triedy. Operátor poskytuje odpoveď vo forme boolovského výrazu, t. j. „true“ alebo „false“. Predbežná kontrola zhody objektu a triedy vám pomôže vyhnúť sa neskorším chybovým hláseniam.
Čo je instanceof v Jave?
Povaha niektorých premenných v Jave nie je vždy okamžite zrejmá. Vo veľkých projektoch v jazyku Java s mnohými premennými môžu napríklad vstupné údaje spôsobiť, že premenná sa zobrazí ako rôzne objekty. Preto programovací jazyk poskytuje používateľom instanceof. Tento operátor v jazyku Java zabezpečuje, že inštancia referenčnej premennej skutočne zodpovedá triede, podtriedy alebo rozhraniu. Ak existuje zhoda, operátor vygeneruje boolovskú hodnotu „true“. Ak neexistuje zhoda, výstupom je „false“.
Pri konverzii neznámeho objektu je dôležité použiť Java instanceof, aby ste sa uistili, že objekt patrí do predpokladanej triedy. Ak túto bezpečnostnú kontrolu preskočíte, môže dôjsť k vydaniu výnimky ClassCastException. K tomu dochádza, keď je potrebné objekt konvertovať do inej triedy. Chybová správa môže byť mätúca a môže spôsobiť problémy, ak je kód obzvlášť dlhý. Preto je najlepšie použiť Java instanceof hneď na začiatku ako bezpečnostné opatrenie.
Aká je syntax pre instanceof?
Keď použijete instanceof v Jave, operátor porovná referenčnú premennú s konkrétnou triedou, ktorú tiež určí používateľ. Nezahŕňa žiadne dodatočné informácie o povahe objektu alebo triedy. Jednoducho určí, či existuje zhoda alebo nie. Syntax je jednoduchá a vyzerá takto:
(object) instanceof (class)javaAk je (object) inštanciou (class), zobrazí sa „true“. Ak tomu tak nie je, zobrazí sa „false“.
Príklady použitia operátora instanceof v jazyku Java
Najskôr vám ukážeme krátky príklad, ktorý demonštruje, ako funguje instanceof v Jave. Tu vytvoríme triedu s názvom „Animal“.
public class Animal {
}javaĎalším krokom je rozšírenie tejto triedy o podtriedu s názvom „Cat“.
public class Cat extends Animal {
}javaTeraz môžeme pomocou Java instanceof skontrolovať, či inštancia Cat patrí do triedy Animal. Na to napíšeme niekoľko ďalších riadkov kódu a výsledok vypíšeme pomocou príkazu Java 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);
}
}javaVýstup by mal vyzerať takto:
truejavaViac úrovní a trieda Object
Tento princíp funguje aj s triedou Main a ďalšími podtriedami. Nasledujúci príklad obsahuje niekoľko úrovní a operátor instanceof v Jave sme rozšírili o if-else. Možno si všimnete, že za dvoma lomítkami (//) je umiestnený dodatočný text. Ide o komentáre v Jave. Vysvetľujú jednotlivé kroky, ale nemajú vplyv na výstup.
// 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");
}
}javaPri pohľade na náš príklad vidíme, že cat1 je inštanciou triedy Cat a nadradenej triedy Animal. Ako taká je odpoveď na obe otázky „true“. Keďže Object, alebo trieda java.lang.Object, je na vrchole hierarchie, cat1 je tiež inštanciou Object. Operátor Java instanceof teda vždy vygeneruje výstup true, ak sa používa s triedou Object. Výstup vyzerá takto:
cat1 is an instance of Cat
cat1 is an instance of Animal
cat1 is an instance of ObjectjavaVýstup s nulovou hodnotou
Ak má premenná nulovú hodnotu (t. j. neobsahuje objekt), operátor Java instanceof automaticky vygeneruje hodnotu „false“. Pozrime sa, ako to funguje, na nasledujúcom príklade:
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");
}
}javaVýstup v tomto prípade je:
cat2 is NOT an instance of CatjavaNadradená trieda/podradená trieda
Hoci objekty v podtriedach patria aj do zodpovedajúcich nadtried podtried, neplatí to naopak. Nasledujúci príklad pomáha ilustrovať tento aspekt hierarchie tried:
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");
}
}javaVýstup v tomto prípade je:
Bello is NOT an instance of CatjavaChybová správa pre nekompatibilné typy
Ak medzi objektom a triedou neexistuje žiadne prepojenie, zobrazí sa hlásenie o chybe. Na ilustráciu vytvoríme novú triedu s názvom „Dog“, ktorá patrí do nadradenej triedy Animal, ale nemá žiadne prepojenie s triedou Cat.
class Dog extends Animal {
}
class Main {
public static void main(String[] args)
{
Cat cat3 = new Cat ();
System.out.println (cat3 instanceof Dog);
}
}javaV tejto situácii dostaneme chybovú správu, ktorá nám oznámi, že medzi triedami Cat a Dog neexistuje žiadne prepojenie. Správa vyzerá takto:
java.lang.Error: Unresolved compilation problem:
Incompatible conditional operand types Cat and DogjavaV našom digitálnom sprievodcovi nájdete ďalšie zaujímavé tutoriály a informatívne články o jazyku Java. Nájdete tu porovnanie jazykov Java a JavaScript, ako aj porovnanie jazykov Java a Python. Môžete sa tiež dozvedieť viac o bitových operátoroch v jazyku Java.