CodeGym /وبلاگ جاوا /Random-FA /نمونه جاوا از اپراتور
John Squirrels
مرحله
San Francisco

نمونه جاوا از اپراتور

در گروه منتشر شد
سلام! امروز ما در مورد عملگر instanceof صحبت خواهیم کرد ، نمونه هایی از نحوه استفاده از آن را در نظر خواهیم گرفت و برخی از جنبه های نحوه کار آن را بررسی خواهیم کرد:) شما قبلاً در سطوح اولیه CodeGym با این اپراتور مواجه شده اید. یادت هست چرا به آن نیاز داریم؟ اگر نه، جای نگرانی نیست. بیا با هم یاد کنیم عملگر instanceof برای بررسی اینکه آیا شیء ارجاع شده توسط متغیر X بر اساس برخی کلاس Y ایجاد شده است یا خیر، مورد نیاز است. ساده به نظر می رسد. چرا به این موضوع برگشتیم؟ اول از همه، به این دلیل که اکنون به خوبی با مکانیسم وراثت جاوا و سایر اصول OOP آشنا هستید. عملگر instanceof اکنون بسیار واضح تر خواهد بود و نمونه های پیشرفته تری از نحوه استفاده از آن را بررسی خواهیم کرد. بیا بریم! چگونه عملگر نمونه کار می کند - 1احتمالاً به یاد دارید که عملگر instanceof در صورتی که چک به true ارزیابی شود، یا اگر عبارت نادرست باشد، false را برمی گرداند. بر این اساس، معمولاً در همه انواع عبارات شرطی ( اگر ... دیگری ) رخ می دهد. بیایید با چند مثال ساده تر شروع کنیم:
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
به نظر شما چه چیزی روی کنسول نمایش داده می شود؟ خب، اینجا واضح است.:) شی x یک عدد صحیح است، بنابراین نتیجه درست خواهد بود . خروجی کنسول: درست است ، بیایید بررسی کنیم که آیا یک رشته است یا خیر :
public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
ما یک خطا دریافت کردیم. و توجه کنید: کامپایلر قبل از اجرای کد خطا را ایجاد کرده است! بلافاصله متوجه شد که عدد صحیح و رشته را نمی توان به طور خودکار به یکدیگر تبدیل کرد و از طریق ارث به هم مرتبط نیستند. در نتیجه، یک شی عدد صحیح بر اساس String ایجاد نمی شود . این راحت است و به جلوگیری از خطاهای عجیب در زمان اجرا کمک می کند، بنابراین کامپایلر در اینجا به ما کمک کرد :) حالا بیایید سعی کنیم نمونه هایی را در نظر بگیریم که دشوارتر هستند. از آنجایی که به ارث بردن اشاره کردیم، بیایید با سیستم کوچک کلاس های زیر کار کنیم:
public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
ما قبلاً می دانیم که instanceof چگونه رفتار می کند وقتی بررسی می کنیم که آیا یک شی نمونه ای از یک کلاس است، اما اگر رابطه والد-فرزند را در نظر بگیریم چه اتفاقی می افتد؟ به عنوان مثال، به نظر شما این عبارات چه نتیجه ای خواهند داشت:
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();

       System.out.println(cat instanceof Animal);

       System.out.println(cat instanceof MaineCoon);

   }
}
خروجی: درست نادرست سؤال اصلی که باید به آن پاسخ داده شود این است که دقیقاً instanceof «شیء ایجاد شده بر اساس یک کلاس» را چگونه تفسیر می کند؟ « نمونه گربه از حیوانات » درست ارزیابی می‌شود ، اما مطمئناً می‌توانیم در این جمله ایراد بگیریم. چرا یک شی Cat بر اساس کلاس Animal ایجاد می شود ؟ آیا فقط بر اساس کلاس خودش ایجاد نشده است؟ پاسخ به اندازه کافی ساده است و ممکن است قبلاً به آن فکر کرده باشید. هنگام ایجاد یک شی، ترتیب فراخوانی سازنده ها و مقداردهی اولیه متغیرها را به خاطر بسپارید. ما قبلاً این موضوع را در مقاله مربوط به سازندگان کلاس پوشش دادیم . در اینجا یک مثال از آن درس آورده شده است:
public class Animal {

   String brain = "Initial value of brain in the Animal class";
   String heart = "Initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("Animal base class constructor is running");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("Current value of static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in the Animal class = " + this.brain);
       System.out.println("Current value of heart in the Animal class = " + this.heart);
       System.out.println("Have the variables of the Cat class already been initialized?");
       System.out.println("Current value of static variable catCount = " + Cat.catCount);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor is done!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The Cat class constructor has started (The Animal constructor already finished)");
       System.out.println("Current value of static variable catCount = " + catCount);
       System.out.println("Current value of tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value of tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
و اگر آن را در IDE اجرا کنید، خروجی کنسول به این صورت خواهد بود: سازنده کلاس پایه Animal در حال اجرا است آیا متغیرهای کلاس Animal قبلاً مقداردهی اولیه شده اند؟ مقدار فعلی متغیر استاتیک animalCount = 7700000 مقدار فعلی مغز در کلاس Animal = مقدار اولیه مغز در کلاس Animal مقدار فعلی قلب در کلاس Animal = مقدار اولیه قلب در کلاس Animal متغیرهای کلاس Cat قبلاً اولیه شده است؟ مقدار فعلی متغیر استاتیک catCount = 37 سازنده کلاس Animal base تمام شد! مقدار کنونی مغز = مغز مقدار فعلی قلب = قلب سازنده کلاس cat شروع شده است (سازنده Animal قبلاً تمام شده است) مقدار فعلی متغیر ثابت catCount = 37 مقدار فعلی دم = مقدار اولیه دم در کلاس Cat مقدار فعلی دم = Tail حالا یادت هست؟:) سازنده کلاس پایه، اگر یک کلاس پایه وجود داشته باشد، همیشه هنگام ایجاد یک شی، اول فراخوانی می شود. عملگر instanceof هنگام تلاش برای تعیین اینکه آیا یک شیء A بر اساس کلاس B ایجاد شده است، توسط این اصل هدایت می شود . اگر سازنده کلاس پایه فراخوانی شود، دیگر شکی وجود ندارد. با بررسی دوم، همه چیز ساده تر است:
System.out.println(cat instanceof MaineCoon);
سازنده MaineCoon هنگام ایجاد شی Cat فراخوانی نشد که منطقی است. به هر حال، مین کون از نوادگان گربه است ، نه یک اجداد. و این یک الگو برای گربه نیست . خوب، من فکر می کنم ما در این مورد روشن هستیم. اما اگر این کار را انجام دهیم چه اتفاقی می افتد؟:
public class Main {

   public static void main(String[] args) {

       Cat cat = new MaineCoon();

       System.out.println(cat instanceof Cat);
       System.out.println(cat instanceof MaineCoon);


   }
}
هوم... حالا این سخت تر است. بیا با هم حرف بزنیم ما یک متغیر Cat داریم که یک شی MaineCoon به آن اختصاص داده ایم . به هر حال، چرا این حتی کار می کند؟ ما می توانیم این کار را انجام دهیم، درست است؟ بله ما میتوانیم. به هر حال، هر MaineCoon یک گربه است. اگر کاملاً واضح نیست، مثالی از گسترش انواع اولیه را به خاطر بسپارید:
public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
عدد 1024 کوتاه است : به راحتی در یک متغیر طولانی قرار می گیرد ، زیرا بایت های کافی برای جا دادن آن وجود دارد (مثال عروسک ها را به خاطر دارید؟). یک شی زاده همیشه می تواند به یک متغیر اجداد نسبت داده شود. در حال حاضر، فقط این را به خاطر بسپارید، و در درس های بعدی نحوه عملکرد آن را تجزیه و تحلیل خواهیم کرد. بنابراین خروجی مثال ما چیست؟
Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
چه نمونه ای بررسی می کند؟ متغیر Cat ما یا شیء MaineCoon ما ؟ پاسخ این است که این سوال در واقع ساده است. فقط باید تعریف عملگر را دوباره بخوانید: عملگر instanceof برای بررسی اینکه آیا شیء ارجاع شده توسط متغیر X بر اساس برخی از کلاس Y ایجاد شده است، مورد نیاز است. عملگر instanceof مبدا یک شی را آزمایش می کند، نه نوع متغیر را. بنابراین، در این مثال، برنامه ما در هر دو حالت درست نمایش داده می شود: ما یک شی MaineCoon داریم. بدیهی است که بر اساس کلاس MaineCoon ساخته شده است ، اما بر اساس کلاس مادر Cat نیز ساخته شده است!
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION