مشخصات مقاله
-
1848
-
0.0
-
5790
-
0
-
0
آموزش Java – عملگر instanceof در Java
آموزش Java – عملگر instanceof در Java
توسعه دهنده می تواند با بهره گیری از 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
}
}
خروجی:
flase
Downcasting/تبدیل از کلاس پدر به کلاس فرزند با عملگر instanceof در Java
زمانی که آبجکتی از کلاس فرزند به آبجکتی از کلاس پدر اشاره کند/آن را در خود فراخوانی کند، Downcasting یا تبدیل از کلاس پدر به فرزند رخ می دهد. downcasting به طور مستقیم ممکن نبوده و در زمان کامپایل خطا می دهد. اگر آن را با عملیات typecasting و تبدیل نوع نیز امتحان کنید، خطای ClassCastException را در زمان اجرا صادر می کند. اما جاوا با ارائه ی عملگر instanceof امکان تبدیل از کلاس پدر به فرزند/downcasting را برای توسعه دهنده فراهم کرده است.
Dog d=new Animal();//Compilation error
زمانی که downcasting را با گرامر تبدیل نوع یا typecasting امتحان نمایید، مانند زیر در زمان اجرا خطای ClassCastException را صادر می کند.
Dog d=(Dog)new Animal(); //Compiles successfully but ClassCastException is thrown at runtime
پیاده سازی 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);
}
}
خروجی:
ok downcasting performed
پیاده سازی 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);
}
}
Output:ok downcasting performed
لازم است مثال فوق را دقیق تر بررسی کنیم. آبجکت واقعی که a به آن اشاره دارد، یک آبجکت از کلاس Dog است. بنابراین زمانی که آن را downcast می کنیم، خطایی رخ نمی دهد. اما زمانی که به صورت زیر اقدام می کنیم، چه اتفاقی رخ می دهد:
Animal a=new Animal(); Dog.method(a); //Now ClassCastException but not in case of instanceof operator
همان طور که می بینید خطای 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