JavaRush /وبلاگ جاوا /Random-FA /کلاس های تو در تو استاتیک

کلاس های تو در تو استاتیک

در گروه منتشر شد
سلام! ما به بررسی موضوع کلاس های تو در تو در جاوا ادامه می دهیم. در درس گذشته در مورد کلاس های تو در تو غیر ایستا یا به اصطلاح کلاس های داخلی صحبت کردیم. کلاس های تو در تو استاتیک - 2امروز بیایید به سراغ گروه دیگری برویم و نگاهی دقیق تر به کلاس های تودرتو ایستا بیندازیم. کلاس های تو در تو استاتیک - 3چه تفاوتی با سایر گروه ها دارند؟ هنگام اعلان چنین کلاسی، از کلمه کلیدی استاتیک آشنا استفاده می کنیم:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
کلاس های تو در تو استاتیک - 4در این مثال، ما یک کلاس خارجی داریم Boeing737که هواپیمای این مدل را ایجاد می کند. و سازنده ای با یک پارامتر دارد: سال ساخت ( int manufactureYear). همچنین یک متغیر ثابت وجود دارد int maxPassengersCount- حداکثر تعداد مسافران. برای همه هواپیماهای یک مدل یکسان خواهد بود، بنابراین ما فقط به یک نسخه نیاز داریم. علاوه بر این، دارای یک کلاس داخلی ثابت است Drawing- نقشه هواپیما. در این کلاس می‌توانیم تمام اطلاعات مربوط به خدمات هواپیما را کپسوله کنیم. در مثال ما، برای سادگی، آن را به سال ساخت محدود کردیم، اما می تواند حاوی اطلاعات زیادی باشد. کلاس های تو در تو استاتیک - 5همانطور که در سخنرانی گذشته بحث کردیم، ایجاد چنین کلاس تودرتویی باعث افزایش کپسوله‌سازی و ترویج یک انتزاع واقعی‌تر می‌شود. تفاوت بین کلاس های تو در تو استاتیک و غیر استاتیک چیست؟ 1. یک شی کلاس ایستا Drawingارجاع به یک نمونه خاص از کلاس خارجی را ذخیره نمی کند. مثال آخرین سخنرانی با دوچرخه را به خاطر بسپار:
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
در آنجا صحبت کردیم که چگونه SteeringWheelارجاع به یک شی از کلاس بیرونی (دوچرخه) به هر نمونه از کلاس داخلی (فرمان فرمان) بدون توجه ما منتقل می شود Bicycle. بدون یک شی از کلاس خارجی، یک شی از کلاس داخلی به سادگی نمی تواند وجود داشته باشد. این برای کلاس های تودرتو ایستا صادق نیست. یک شی از یک کلاس تودرتو ایستا به راحتی می تواند به تنهایی وجود داشته باشد. در این راستا، کلاس‌های استاتیک «مستقل»تر از کلاس‌های غیراستاتیک هستند. تنها نکته این است که هنگام ایجاد چنین شیء باید نام کلاس خارجی را مشخص کنید:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
چرا کلاس را ایستا کردیم Drawingاما در سخنرانی آخر کلاس Seat(صندلی دوچرخه) غیر ثابت بود؟ مثل دفعه قبل، بیایید کمی "فلسفه" اضافه کنیم تا مثال را بفهمیم :) بر خلاف صندلی دوچرخه، ماهیت نقاشی آنقدر محکم به ماهیت هواپیما گره خورده نیست. یک شی صندلی جداگانه، بدون دوچرخه، اغلب بی معنی خواهد بود (البته نه همیشه - ما در درس گذشته در مورد آن صحبت کردیم). ماهیت نقاشی به خودی خود معنا دارد. به عنوان مثال، ممکن است برای مهندسان برنامه‌ریزی تعمیرات هواپیما مفید باشد. آنها برای برنامه ریزی به خود هواپیما نیاز ندارند و می توانند در هر جایی قرار گیرند - فقط یک نقاشی کافی است. علاوه بر این، برای همه هواپیماهای یک مدل، نقشه همچنان یکسان خواهد بود، بنابراین اتصال سفت و سختی مانند صندلی با دوچرخه وجود ندارد. بنابراین، شی Drawingنیازی به پیوند به یک شی هواپیمای خاص ندارد. 2. دسترسی متفاوت به متغیرها و متدهای یک کلاس خارجی. یک کلاس تودرتو ایستا فقط می تواند به فیلدهای ثابت کلاس بیرونی دسترسی داشته باشد. در مثال ما، کلاس Drawingمتدی دارد getMaxPassengersCount()که مقدار یک متغیر استاتیک را maxPassengersCountاز یک کلاس خارجی برمی‌گرداند. با این حال، نمی‌توانیم متدی getManufactureYear()برای Drawingبرگرداندن مقدار ایجاد کنیم manufactureYear. به هر حال، یک متغیر manufactureYearغیر استاتیک است، به این معنی که باید به یک نمونه خاص تعلق داشته باشد Boeing737. و همانطور که قبلا متوجه شدیم، در مورد کلاس های تودرتو ایستا، شیء کلاس خارجی می تواند به راحتی از بین برود. از این رو محدودیت :) فرقی نمی‌کند که متغیر استاتیک در کلاس خارجی چه اصلاح‌کننده دسترسی داشته باشد. حتی اگر باشد private، باز هم از یک کلاس تودرتو ایستا دسترسی وجود خواهد داشت. تمام موارد فوق نه تنها به دسترسی به متغیرهای استاتیک، بلکه به روش های استاتیک نیز مربوط می شود. مهم! کلمه staticدر یک اعلان کلاس داخلی به این معنی نیست که فقط یک شی را می توان ایجاد کرد. اشیا را با متغیرها اشتباه نگیرید. اگر در مورد متغیرهای استاتیک صحبت می کنیم، بله، برای مثال یک متغیر کلاس ایستا maxPassangersCountدر یک کپی وجود دارد. اما وقتی برای یک کلاس تودرتو اعمال می شود، staticفقط به این معنی است که اشیاء آن حاوی ارجاعاتی به اشیاء کلاس خارجی نیستند. و ما می توانیم هر تعداد که دوست داریم شی ایجاد کنیم:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
ما متد را main()مستقیماً در کلاس تودرتو اعلام کردیم (دلیل خاصی برای این وجود ندارد - فقط برای اینکه بدانید امکان پذیر است) و 5 شی ایجاد کردیم Drawing. با وجود این واقعیت که ما یک شی واحد از یک کلاس خارجی نداریم. همانطور که می بینید هیچ مشکلی وجود نداشت :) خروجی کنسول:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
این درس ما را به پایان می رساند! در هر صورت، من پیوندی به بخش مربوط به آنها در اسناد Oracle برای شما می گذارم . در صورت وجود نکات نامشخص، آن را بخوانید. اکنون زمان حل یکی دو مشکل است! :)
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION