- java instanceof
- Пример за оператор instanceof
- Прилагането на оператора instanceof с променлива има нулева стойност
- Преобразуване надолу с оператор instanceof
- Преобразуване надолу без оператор instanceof
The java instanceof оператор се използва за проверка дали обектът е екземпляр от посочения тип (клас или подклас или интерфейс).
Екземплярът на java е известен също като тип оператор за сравнение защото сравнява инстанцията с типа. Връща или true, или false. Ако приложим оператора instanceof с която и да е променлива, която има нулева стойност, тя връща false.
Прост пример за java instanceof
Нека видим простия пример за оператор на екземпляр, където тества текущия клас.
class Simple1{ public static void main(String args[]){ Simple1 s=new Simple1(); System.out.println(s instanceof Simple1);//true } }Тествайте сега
Output:true
Обект от тип подклас също е тип родителски клас. Например, ако Dog разширява Animal, тогава обектът на Dog може да бъде препратен от клас Dog или Animal.
Друг пример за оператор на java instanceof
class Animal{} class Dog1 extends Animal{//Dog inherits Animal public static void main(String args[]){ Dog1 d=new Dog1(); System.out.println(d instanceof Animal);//true } }Тествайте сега
Output:true
instanceof в java с променлива, която има нулева стойност
Ако приложим оператор instanceof с променлива с нулева стойност, той връща false. Нека видим примера, даден по-долу, където прилагаме оператор instanceof с променлива, която има нулева стойност.
class Dog2{ public static void main(String args[]){ Dog2 d=null; System.out.println(d instanceof Dog2);//false } }Тествайте сега
Output:false
Понижаване с оператор на java instanceof
Когато типът подклас се отнася до обекта на родителския клас, това е известно като низходящо предаване. Ако го изпълним директно, компилаторът дава грешка при компилиране. Ако го изпълните чрез преобразуване на типове, ClassCastException се хвърля по време на изпълнение. Но ако използваме оператор instanceof, понижаването е възможно.
Dog d=new Animal();//Compilation error
Ако извършим downcasting чрез typecasting, ClassCastException се хвърля по време на изпълнение.
Dog d=(Dog)new Animal(); //Compiles successfully but ClassCastException is thrown at runtime
Възможност за понижаване с instanceof
Нека да видим примера, където понижаването е възможно чрез оператор instanceof.
class Animal { } class Dog3 extends Animal { static void method(Animal a) { if(a instanceof Dog3){ Dog3 d=(Dog3)a;//downcasting System.out.println('ok downcasting performed'); } } public static void main (String [] args) { Animal a=new Dog3(); Dog3.method(a); } }Тествайте сега
Output:ok downcasting performed
Прехвърляне без използване на java instanceof
Преобразуването надолу може да се извърши и без използването на оператор instanceof, както е показано в следния пример:
class Animal { } class Dog4 extends Animal { static void method(Animal a) { Dog4 d=(Dog4)a;//downcasting System.out.println('ok downcasting performed'); } public static void main (String [] args) { Animal a=new Dog4(); Dog4.method(a); } }Тествайте сега
Output:ok downcasting performed
Нека да разгледаме по-отблизо този действителен обект, който е препратен от a, е обект от клас Dog. Така че, ако го намалим, всичко е наред. Но какво ще стане, ако напишем:
Animal a=new Animal(); Dog.method(a); //Now ClassCastException but not in case of instanceof operator
Разбиране на реалното използване на instanceof в java
Нека видим реалното използване на ключовата дума instanceof чрез примера, даден по-долу.
interface Printable{} class A implements Printable{ public void a(){System.out.println('a method');} } class B implements Printable{ public void b(){System.out.println('b method');} } class Call{ void invoke(Printable p){//upcasting if(p instanceof A){ A a=(A)p;//Downcasting a.a(); } if(p instanceof B){ B b=(B)p;//Downcasting b.b(); } } }//end of Call class class Test4{ public static void main(String args[]){ Printable p=new B(); Call c=new Call(); c.invoke(p); } }Тествайте сега
Output: b method