Jak funguje operátor instanceof v jazyře Java
Pomocí operátoru Java instanceof můžete zkontrolovat, zda objekt patří do konkrétní třídy. Operátor poskytuje odpověď ve formě logického výrazu, tj. „true“ (pravda) nebo „false“ (nepravda). Předběžná kontrola shody objektu a třídy vám pomůže vyhnout se pozdějším chybovým hlášením.
Co je instanceof v Javě?
Povaha některých proměnných v Javě není vždy okamžitě zřejmá. Ve velkých projektech v jazyce Java s mnoha proměnnými mohou například vstupní data způsobit, že se proměnná jeví jako různé objekty. Proto programovací jazyk poskytuje uživatelům instanceof. Tento operátor jazyka Java zajišťuje, že instance referenční proměnné skutečně odpovídá třídě, podtřídě nebo rozhraní. Pokud existuje shoda, operátor vygeneruje logickou hodnotu „true“. Pokud shoda neexistuje, výstupem je „false“.
Při převodu neznámého objektu je důležité použít Java instanceof, aby se zajistilo, že objekt patří do předpokládané třídy. Pokud tuto bezpečnostní kontrolu přeskočíte, může dojít k vydání výjimky ClassCastException. K tomu dochází, když je třeba objekt převést do jiné třídy. Chybová zpráva může být matoucí a může způsobit problémy, pokud je kód obzvláště dlouhý. Proto je nejlepší použít Java instanceof již v rané fázi jako bezpečnostní opatření.
Jaká je syntaxe pro instanceof?
Když v Javě použijete instanceof, operátor porovná referenční proměnnou s konkrétní třídou, kterou také určí uživatel. Nezahrnuje žádné další informace o povaze objektu nebo třídy. Jednoduše určí, zda existuje shoda, nebo ne. Syntaxe je jednoduchá a vypadá takto:
(object) instanceof (class)javaPokud je (object) instancí (class), zobrazí se „true“. Pokud tomu tak není, zobrazí se „false“.
Příklady použití operátoru instanceof v Javě
Nejprve vám ukážeme krátký příklad, který demonstruje, jak funguje instanceof v Javě. Zde vytvoříme třídu s názvem „Animal“.
public class Animal {
}javaDalším krokem je rozšíření této třídy o podtřídu s názvem „Cat“.
public class Cat extends Animal {
}javaNyní můžeme pomocí Java instanceof zkontrolovat, zda instance Cat patří do třídy Animal. K tomu napíšeme několik dalších řádků kódu a výsledek vypisujeme pomocí pří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 měl vypadat takto:
truejavaVíce úrovní a třída Object
Tento princip funguje také s třídou Main a dalšími podtřídami. Následující příklad obsahuje několik úrovní a operátor instanceof v Javě jsme rozšířili o if-else. Možná si všimnete, že za dvěma lomítky (//) je umístěn další text. Jedná se o komentáře v Javě. Vysvětlují jednotlivé kroky, ale nemají vliv 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");
}
}javaPodíváme-li se na náš příklad, vidíme, že cat1 je instancí třídy Cat a supertřídy Animal. Odpověď na obě otázky je tedy „true“. Jelikož Object, neboli třída java.lang.Object, je na vrcholu hierarchie, je cat1 také instancí Object. Operátor Java instanceof tedy při použití s třídou Object vždy vrátí hodnotu true. Výstup vypadá takto:
cat1 is an instance of Cat
cat1 is an instance of Animal
cat1 is an instance of ObjectjavaVýstup s nulovou hodnotou
Pokud má proměnná nulovou hodnotu (tj. neobsahuje objekt), operátor Java instanceof automaticky vygeneruje hodnotu „false“. Podívejme se, jak to funguje, na následujícím příkladu:
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 případě je:
cat2 is NOT an instance of CatjavaNadřazená třída/podřazená třída
Ačkoli objekty v podtřídách patří také do odpovídajících nadřazených tříd podtříd, opačně to neplatí. Následující příklad pomáhá ilustrovat tento aspekt hierarchie tříd:
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 případě je:
Bello is NOT an instance of CatjavaChybová zpráva pro nekompatibilní typy
Pokud mezi objektem a třídou neexistuje žádné spojení, zobrazí se hlášení o chybě. Pro ilustraci vytvoříme novou třídu s názvem „Dog“, která patří do nadřazené třídy Animal, ale nemá žádné spojení s třídou Cat.
class Dog extends Animal {
}
class Main {
public static void main(String[] args)
{
Cat cat3 = new Cat ();
System.out.println (cat3 instanceof Dog);
}
}javaV této situaci se zobrazí chybová zpráva, která nám sdělí, že mezi třídami Cat a Dog neexistuje žádné spojení. Zpráva vypadá takto:
java.lang.Error: Unresolved compilation problem:
Incompatible conditional operand types Cat and DogjavaV našem digitálním průvodci najdete další zajímavé návody a informativní články o jazyce Java. Najdete zde srovnání jazyků Java a JavaScript, stejně jako srovnání jazyků Java a Python. Můžete se také dozvědět více o bitových operátorech v jazyce Java.