می 28, 2019 Mostafa بدون دیدگاه

اگر دنبال برنامه نویس برای ساخت افزونه ،قالب،سایت،برنامه ویندوز،اپلیکیشین اندروید،ربات تلگرام و.... هستید ،سفارش برنامه نویسی را مطالعه نمایید.

توجه : درخواست افزونه ،قالب، اسکریپت و نرم افزار و ... و سوالات و مشکلات خود را در انجمن ارسال نمایید

توسعه دهنده می تواند با بهره گیری از instanceof بررسی کند آیا شی مورد نظر نمونه ای از نوع مشخص است یا خیر (کلاس یا کلاس فرزند (subclass) و یا interface).

instanceof در جاوا همچنین تحت عنوان عملگر مقایسه شناخته می شود چرا که کار آن مقایسه ی نوع با نمونه می باشد.

خروجی این عملگر بر اساس شرایط همیشه یکی از دو مقدار بولی true یا false می باشد. لازم به ذکر است که اگر عملگر instanceof را با متغیری که محتوای آن null می باشد استفاده کنید، مقدار بولی false را برمی گرداند.
مثال کاربردی ساده از عملگر   instanceof :

در مثال زیر با استفاده از عملگر مذکور بررسی می کنیم آیا شی s نمونه ای از جنس کلاس Simple1 هست یا خیر.

class Simple1{  
 public static void main(String args[]){  
 Simple1 s=new Simple1();  
 System.out.println(s instanceof Simple1);//true  
 }  
}

خروجی : true

آبجکتی از جنس کلاس فرزند، متعاقبا نوعی از جنس کلاس پدر نیز می باشد. برای مثال، اگر کلاس Dog از کلاس Animal ارث بری داشته باشد، آنگاه آبجکت کلاس Dog هم داخل نمونه ای از جنس خود Dog و هم در نمونه ای از جنس Animal قابل ذخیره و فراخوانی می باشد.

مثال کاربردی دیگر از عملگر 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  
 }  
}

خروجی : true

استفاده از instnaceof با متغیری که حاوی مقدار null است

اگر از عملگر instanceof برای مقایسه و بررسی صحت نوع متغیری که مقدارش null استفاده نمایید، همیشه مقدار بولی false را به عنوان خروجی برمی گرداند. در زیر مثال ساده ای را می بینید که در آن با استفاده از instanceof بررسی می شود آیا متغیر d که حاوی مقدار null است، از جنس کلاس Dog2 می باشد یا خیر.

class Dog2{  
 public static void main(String args[]){  
  Dog2 d=null;  
  System.out.println(d instanceof Dog2);//false  
 }  
}

خروجی : false

Downcasting/تبدیل از کلاس پدر به کلاس فرزند با عملگر instanceof در Java

زمانی که آبجکتی از کلاس فرزند به آبجکتی از کلاس پدر اشاره کند/آن را در خود فراخوانی کند، Downcasting یا تبدیل از کلاس پدر به فرزند رخ می دهد. downcasting به طور مستقیم ممکن نبوده و در زمان کامپایل خطا می دهد. اگر آن را با عملیات typecasting و تبدیل نوع نیز امتحان کنید، خطای ClassCastException را در زمان اجرا صادر می کند. اما جاوا با ارائه ی عملگر instanceof امکان تبدیل از کلاس پدر به فرزند/downcasting را برای توسعه دهنده فراهم کرده است.

Dog d=new Animal();//خطا زمان کامپایل

زمانی که downcasting را با گرامر تبدیل نوع یا typecasting امتحان نمایید، مانند زیر در زمان اجرا خطای ClassCastException را صادر می کند.

Dog d=(Dog)new Animal();

پیاده سازی downcasting با عملگر 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);  
  }  
 }

پیاده سازی downcasting بدون 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);  
  }  
}  
خروجی : ok downcasting performed

لازم است مثال فوق را دقیق تر بررسی کنیم. آبجکت واقعی که a به آن اشاره دارد، یک آبجکت از کلاس Dog است. بنابراین زمانی که آن را downcast می کنیم، خطایی رخ نمی دهد. اما زمانی که به صورت زیر اقدام می کنیم، چه اتفاقی رخ می دهد:

Animal a=new Animal();  
Dog.method(a);  

همان طور که می بینید خطای ClassCastException رخ می دهد. اما اگر همانند مثال قبل تر از عملگر instanceof استفاده کنید، مشکل برطرف می شود.
کاربرد حقیقی عملگر 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);  
}  
}  

خروجی :

b method

 


برچسب ها