سطح دسترسی در Java
یک کلاس Gate در Gate.java بنویسید با فیلد private int به نام code، سازندهٔ Gate(int n) که code = n; میگذارد، و متد void show() که code را چاپ میکند. در Pier.java یک gate بسازید با Gate g = new Gate(9);، بعد صدا بزنید g.show();. هر دو فایل را کامپایل کنید و java Pier را اجرا کنید. صفحه باید یک خط نشان دهد: 9. فیلد از Pier پنهان است. متد روی Gate هنوز میتواند بخواندش. گذاشتن private روی فیلد کار این صفحه است.
فیلدی که Pier نباید مستقیم نام ببرد
تا اینجا کلاسهای دیگر در همان پوشه اغلب میتوانستند به فیلدهایی مثل j.fill یا t.size برسند وقتی آن فیلدها واژهٔ دسترسی نداشتند. واژهٔ private این را عوض میکند. فیلد private مال کلاسی است که اعلامش کرده. متدهای داخل همان کلاس میتوانند از فیلد استفاده کنند. کلاس دیگر — اینجا Pier — نباید g.code بنویسد.
اول Gate.java را بسازید. خط public class برابر public class Gate است. نام کلاس قدیمی Tag یا Jar را اینجا نگه ندارید. داخل آکولاد private int code; را اعلام کنید. سازنده را بنویسید Gate(int n) { code = n; } با نامهای متفاوت تا این صفحه به this نیاز نداشته باشد. بعد بنویسید:
void show() { System.out.println(code); }
در Gate.java هیچ main نیست. قبل از کامپایل ذخیره کنید. متد show در همان کلاس code نشسته، پس میتواند فیلد private را بخواند. مسیر مجاز این صفحه همین است.
public class Gate {
private int code;
Gate(int n) {
code = n;
}
void show() {
System.out.println(code);
}
}
Pier صدا میزند show، نه g.code
در همان پوشه Pier.java بسازید. خط public class آن public class Pier است. داخل main بنویسید Gate g = new Gate(9); بعد g.show();. روی این صفحه System.out.println(g.code); ننویسید. اگر از Pier مقدار g.code را بخوانید در حالی که code از نوع private است، javac رد میکند.
Pier را کلاسی نگه دارید که main دارد. برای این درس main را داخل Gate نگذارید. اگر فایل ماندهٔ Yard از صفحهٔ static هنوز در پوشه است، برای این درس java Yard را اجرا نکنید — بعد از کامپایل Gate.java و Pier.java فرمان java Pier را بزنید.
public class Pier {
public static void main(String[] args) {
Gate g = new Gate(9);
g.show();
}
}
از پوشهای که هر دو فایل آنجاست، javac Gate.java Pier.java را اجرا کنید. میتوانید وقتی هر دو کاملاند اول Gate.java و بعد Pier.java را کامپایل کنید. وقتی پرانتز و آکولاد و نقطهویرگولها جور باشند، javac خودش خطی نمینویسد. بعد java Pier را اجرا کنید — نه java Pier.java، و نه java Gate. پسوند .java را از فرمان اجرا بردارید. کلاسی را شروع کنید که main دارد. همین فرمانها در Windows و macOS کار میکند.
برنامه باید یک خط چاپ کند و بایستد: 9. منتظر تایپ شما نمیماند. اگر ترمینال منتظر ورودی صفحهکلید ماند، هنوز صدای nextLine از تمرین قدیمی در فایلی مانده است. آن را پاک کنید و new Gate(9) بههمراه g.show(); را در Pier نگه دارید، با private int code در Gate.
اجرا را یکبار ببینید. Java از Pier.main شروع میکند. عبارت new Gate(9) یک gate میسازد و داخل سازنده 9 را در code میگذارد. فراخوانی g.show() وارد show روی همان شیء میشود. داخل Gate، متد show میتواند code را بخواند و 9 چاپ میکند. Pier هیچوقت فیلد را نام نبرد. صفحه 9 نشان میدهد.
اگر در Pier بهجای g.show(); بنویسید System.out.println(g.code);، تا وقتی code از نوع private است javac با خطای دسترسی میایستد. همان رد شدن نکتهٔ این صفحه است. دوباره g.show(); را بگذارید.
مقایسه با static و با فیلدهای باز
روی صفحهٔ static بدون فیلد پنهان صدا میزدید Tag.ping();. آن هنوز کار میکند. این صفحه فیلد را پنهان میکند و یک متد باز میگذارد. دموی ماندهٔ Tag.ping(); درس دیگری است. برای این صفحه Gate و Pier و g.show(); را نگه دارید.
صفحات قبلی اغلب فیلدها را بدون private میگذاشتند، پس j.fill از کلاس دیگر کامپایل میشد. آن شکل شلتر هنوز در دموهای کوچک دیده میشود. این درس عمداً private را انتخاب میکند تا مرز را ببینید. چاپ خود g با System.out.println(g); یک 9 تمیز نشان نمیدهد. g.show(); را صدا بزنید یا از راه متدی چاپ کنید که کلاس اجازه میدهد.
دو gate، دو code
هر new Gate(...) مقدار code private خودش را نگه میدارد. میتوانید بنویسید Gate a = new Gate(2); و Gate b = new Gate(8);، بعد صدا بزنید a.show(); و b.show();.
public class Pier {
public static void main(String[] args) {
Gate a = new Gate(2);
Gate b = new Gate(8);
a.show();
b.show();
}
}
دوباره کامپایل و اجرا کنید: javac Gate.java Pier.java، بعد java Pier. صفحه باید روی یک خط 2 و روی خط بعد 8 نشان دهد. هر فراخوانی show روی شیء خودش اجرا شد و فیلد private همان شیء را خواند. نوشتن Gate b = a; شیء دوم نمیسازد — وقتی دو code میخواهید دو بار new Gate(...) بزنید.
اگر هر دو خط یک عدد نشان دادند، چک کنید هر new آرگومان متفاوتی دارد. اگر javac از code داخل Pier شکایت کرد، هنوز خط مستقیم g.code دارید — آن را بردارید و show را نگه دارید.
چه چیزی برای packages میماند
این صفحه هر دو فایل را در یک پوشه با چیدمان بستهٔ پیشفرض نگه میدارد. صفحهٔ بعدی — packages — کلاسها را با خطهای package داخل پوشههای نامدار میگذارد. اینجا با private و show بمانید. روی این صفحه جدول کامل public/protected نسازید؛ هدف درس یک فیلد private و یک متد است که هنوز میتواند بخواندش.
اگر هنگام کامپایل Pier.java، javac کلاس Gate را پیدا نکرد، چک کنید Gate.java در همان پوشه است و خط کلاس public class Gate است. وقتی پوشه هنوز Tag.java یا Yard.java دارد، یا دست نزنید یا فقط اگر فرمان کامپایل را گیج میکنند پاکشان کنید. بعد از کامپایل جفت Gate و Pier این درس، java Pier را اجرا کنید.
قبل از packages
میتوانید private int code; را اعلام کنید، Gate(int n) { code = n; } و void show() { System.out.println(code); } بنویسید، و از Pier اجرا کنید Gate g = new Gate(9); بعد g.show();. هر دو فایل را کامپایل کنید و java Pier را اجرا کنید. صفحه 9 نشان میدهد. فیلد private داخل Gate ماند. متد همان کلاس چاپش کرد. صفحهٔ بعدی packages است، جایی که کلاسها را در پوشههای بستهٔ نامدار میگذارید.
private را روی فیلد نگه دارید. چاپ را داخل show نگه دارید، نه بهصورت g.code از Pier. main را در Pier نگه دارید. این سه عادت نقطهٔ کنترل این صفحه است قبل از رفتن جلو. وقتی صفحه از راه show عدد 9 را نشان داد، مرز دسترسی را همانطور که این درس میخواهد رد کردهاید.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود