CodeGym /وبلاگ جاوا /Random-FA /کلاس های تو در تو استاتیک
John Squirrels
مرحله
San Francisco

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

در گروه منتشر شد
سلام! ما به بررسی موضوع کلاس های تو در تو در جاوا ادامه می دهیم. در آخرین تمرین در مورد کلاس های تو در تو غیر ایستا صحبت کردیم که به عنوان کلاس های داخلی نیز شناخته می شوند کلاس های تو در تو استاتیک - 1امروز به سراغ گروه دیگری از کلاس ها می رویم. ما کلاس های تودرتو ایستا را در نظر خواهیم گرفت. کلاس های تو در تو استاتیک - 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 maxWeight;

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

   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
در آن درس، ما در مورد این واقعیت صحبت کردیم که هر نمونه از Handlebarطبقه درونی، به طور نامحسوس برای ما، اشاره ای به نمونه 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