آموزش عملگر instanceof در جاوا (به زبان کاملا ساده)
در این آموزش با کمک مثال با جزئیات عملگر instanceof آشنا می شوید.
در جاوا ، کلمه کلیدی instanceof یک عملگر باینری است. برای بررسی اینکه آیا یک شیء نمونه ای از کلاس خاصی است یا خیر ، استفاده می شود.
این عملگر همچنین بررسی می کند که آیا یک شیء نمونه ای از کلاسی است که یک اینترفیس را پیاده سازی می کند.
ساختار عملگر instanceof به شکل زیر است:
- result = objectName instanceof className;
عبارت سمت چپ instanceof نام شی و عبارت سمت راست نام کلاس است. اگر شی نمونه ای از کلاس باشد result صحیح و در غیر اینصورت غلط است.
مثال ۱ : instanceof در جاوا
- class Main {
- public static void main (String[] args) {
- String name = “Programiz”;
- Integer age = 22;
-
- System.out.println(“Is name an instance of String: “+ (name instanceof String));
- System.out.println(“Is age an instance of Integer: “+ (age instanceof Integer));
- }
- }
خروجی
Is name an instance of String: true
Is age an instance of Integer: true
در مثال بالا ، ما یک شی nameاز نوع String و یک شی age از نوع Integer ایجاد کردیم. سپس از عملگر instanceof برای بررسی اینکه آیا name از نوع String و age از نوع Integer است استفاده کردیم.
استفاده از instanceof در وراثت
در وراثت ، از عملگر instanceof برای بررسی اینکه آیا یک شی از subclass نمونه ای از superclass است یا خیر استفاده می شود.
مثال ۲ : instanceof در وراثت
- class Animal {
- }
- class Dog extends Animal {
- }
- class Main {
- public static void main(String[] args){
- Dog d1 = new Dog();
- System.out.println(“Is d1 an instance of Dog: “+ (d1 instanceof Dog));
- System.out.println(“Is d1 an instance of Animal: “+ (d1 instanceof Animal));
- }
- }
خروجی
Is d1 is an instance of Dog: true
Is d1 an instance of Animal: true
در مثال بالا ، d1 نمونه ای از کلاس Dog و Animal است. از این رو ، هر دو d1 instanceof Dog و d1 instanceof Animal برابر با true است.
کلاس شی
در جاوا ، تمام کلاس ها از کلاس Object ارث می برند. کلمه کلیدی extends در ارث بری کلاس Object استفاده نمی شود. این یک استثنا در جاوا است.
مثال ۳ : کلاس شی
- class Animal {
- }
- class Dog {
- }
- class Cat {
- }
- class Main {
- public static void main(String[] args) {
- Dog d1 = new Dog();
- Animal a1 = new Animal();
- Cat c1 = new Cat();
-
- System.out.println(“Is d1 an instance of the Object class: “+ (d1 instanceof Object));
- System.out.println(“Is a1 an instance of the Object class: “+ (a1 instanceof Object));
- System.out.println(“Is c1 an instance of the Object class: “+ (c1 instanceof Object));
- }
- }
خروجی
Is d1 an instance of the Object class: true
Is a1 an instance of the Object class: true
Is c1 an instance of the Object class: true
در مثال بالا ، به ترتیب اشیاء a1 ، d1 و c1 را از کلاس های Animal ، Dog و Cat ایجاد کرده ایم. ما از عملگر instanceof برای بررسی اینکه آیا این اشیاء a1 ، d1 و c1 نیز اشیاء کلاس Object هستند استفاده کرده ایم. نتایج خروجی برای همه true است.
جاوا، جاوا اسکریپت رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی عالی با توسعه وب، ماشین لرنینگ و ... کتابخانه های پیشرفته جاوا اسکریپت و ... دانلود:
زیرا کلاس Object ، کلاس root است که در پکیج java.lang تعریف شده است. تمام کلاس های دیگر کلاس های فرزند کلاس Object هستند که سلسله مراتب را در جاوا تشکیل می دهند.
اشیاء upcasting و downcasting
در جاوا ، یک شیء از subclass ممکن است مانند یک شیء از superclass رفتار کند. به این حالت upcasting گفته می شود.
کامپایلر جاوا بطور خودکار upcasting را انجام می دهد.
مثال ۴ : شی upcasting
- class Animal {
- public void displayInfo() {
- System.out.println(“I am an animal.”);
- }
- }
-
- class Dog extends Animal {
- }
-
- class Main {
- public static void main(String[] args) {
- Dog d1 = new Dog();
- Animal a1 = d1;
- a1.displayInfo();
- }
- }
خروجی
I am an animal.
در مثال بالا ، یک شیء d1 از کلاس Dog ایجاد کرده ایم. ما از آن شی d1 برای ایجاد یک شیء a1 از کلاس Animal با upcasting استفاده می کنیم.
کد بدون هیچ مشکلی اجرا می شود. زیرا با استفاده از کامپایلرهای جاوا ، upcasting انجام می شود.
downcasting یک روش معکوس upcasting است.
در مورد upcasting ، یک شیء از superclass مانند یک شی از subclass رفتار می کند. باید صریحا به کامپایلر دستور دهیم تا در جاوا downcast کند.
مثال ۵ : مشکل downcasting شی
- class Animal {
- }
-
- class Dog extends Animal {
- public void displayInfo() {
- System.out.println(“I am a dog.”);
- }
- }
-
- class Main {
- public static void main(String[] args) {
- Dog d1 = new Dog();
- Animal a1 = d1; // Upcasting
- Dog d2 = (Dog)a1; // Downcasting
- d2.displayInfo();
- }
- }
وقتی برنامه را اجرا کردیم ، با استثنا ClassCastException روبرو می شویم. بیایید ببینیم چه اتفاقی می افتد.
در اینجا ، ما یک شیء a1 از سوپرکلاس Animal ایجاد کرده ایم. سپس شی a1 را برابر شی d1 از Dog قرار دادیم.
این کار مسئله به وجود آورد زیرا یک شیء a1 از سوپرکلاس Animal ممکن است به زیر کلاس های دیگر نیز رجوع کند. اگر ما یک زیر کلاس دیگر Cat را به همراه Dog ایجاد کرده بودیم Animal ممکن است Cat باشد یا شاید Dog و همین باعث ابهام شود.
برای برطرف کردن این مشکل می توانیم از عملگر instanceof استفاده کنیم.
مثال ۶ : حل downcasting با استفاده از instanceof
- class Animal {
- }
-
- class Dog extends Animal {
- public void displayInfo() {
- System.out.println(“I am a dog”);
- }
- }
-
- class Main {
- public static void main(String[] args) {
- Dog d1 = new Dog();
- Animal a1 = d1; // Upcasting
-
- if (a1 instanceof Dog){
- Dog d2 = (Dog)a1; // Downcasting
- d2.displayInfo();
- }
- }
- }
خروجی
I am a dog
در مثال بالا ، ما از عملگر instanceof برای بررسی اینکه آیا a1 نمونه ای از کلاس Dog است یا خیر استفاده می کنیم. downcasting فقط وقتی انجام می شود که عبارت Dog a1 instanceof صحیح باشد.
instanceof در اینترفیس
از عملگر instanceof برای بررسی اینکه آیا یک شیء از کلاس نیز نمونه ای از اینترفیس است که در آن کلاس پیاده سازی شده استفاده می شود.
مثال ۷ : instanceof در اینترفیس
- interface Animal {
- }
- class Dog implements Animal {
- }
-
- class Main {
- public static void main(String[] args) {
- Dog d1 = new Dog();
- System.out.println(“Is d1 an instance of Animal: “+(d1 instanceof Animal));
- }
- }
خروجی
Is d1 an instance of Animal: true
در مثال بالا ، ما یک کلاس Dog ایجاد کرده ایم که اینترفیس Animal را پیاده سازی کند.
سپس شیء d1 از کلاس Dog ایجاد می شود. از عملگر instanceof برای بررسی اینکه آیا d1 نیز نمونه ای از اینترفیس Animal است استفاده کرده ایم.