سلام! ما به بررسی موضوع کلاس های تو در تو در جاوا ادامه می دهیم. در درس گذشته در مورد کلاس های تو در تو غیر ایستا یا به اصطلاح کلاس های داخلی صحبت کردیم. امروز بیایید به سراغ گروه دیگری برویم و نگاهی دقیق تر به کلاس های تودرتو ایستا بیندازیم. چه تفاوتی با سایر گروه ها دارند؟ هنگام اعلان چنین کلاسی، از کلمه کلیدی استاتیک آشنا استفاده می کنیم:
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;
}
}
}
در این مثال، ما یک کلاس خارجی داریم Boeing737
که هواپیمای این مدل را ایجاد می کند. و سازنده ای با یک پارامتر دارد: سال ساخت ( int manufactureYear
). همچنین یک متغیر ثابت وجود دارد int maxPassengersCount
- حداکثر تعداد مسافران. برای همه هواپیماهای یک مدل یکسان خواهد بود، بنابراین ما فقط به یک نسخه نیاز داریم. علاوه بر این، دارای یک کلاس داخلی ثابت است Drawing
- نقشه هواپیما. در این کلاس میتوانیم تمام اطلاعات مربوط به خدمات هواپیما را کپسوله کنیم. در مثال ما، برای سادگی، آن را به سال ساخت محدود کردیم، اما می تواند حاوی اطلاعات زیادی باشد. همانطور که در سخنرانی گذشته بحث کردیم، ایجاد چنین کلاس تودرتویی باعث افزایش کپسولهسازی و ترویج یک انتزاع واقعیتر میشود. تفاوت بین کلاس های تو در تو استاتیک و غیر استاتیک چیست؟ 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 برای شما می گذارم . در صورت وجود نکات نامشخص، آن را بخوانید. اکنون زمان حل یکی دو مشکل است! :)
GO TO FULL VERSION