محدودهٔ نام در Java
متدی به نام mark با یک پارامتر بنویسید: static void mark(int n). داخل آکولاد آن پارامتر را با System.out.println(n); چاپ کنید. از main صدا بزنید mark(4);. صفحه باید یک خط نشان دهد: 4. نام n فقط داخل mark وجود دارد. اگر بخواهید از main خودِ n را چاپ کنید، javac قبول نمیکند. همین مرز — کدام نامها را یک متد میبیند — کار این صفحه است.
نامهایی که داخل متد میمانند
روی صفحهٔ اضافهبار، چند متد paint یک نام را شریک بودند ولی فهرست پارامتر جدا داشتند. اینجا تمرکز کوچکتر است: یک متد، یک نام پارامتر، و جایی که آن نام اجازهٔ ظاهر شدن دارد. پارامتر نامی است که مال همان متدی است که آن را اعلام کرده. بیرون از آکولاد آن متد، آن نام دیگر نیست.
یک برنامهٔ کوچک با نام Gate.java بسازید. public class روی خط اول باید با نام فایل یکی باشد: public class Gate. نام کلاس قدیمی Sign یا Box را در این فایل نگه ندارید؛ کامپایلر انتظار دارد نام کلاس و نام فایل جور باشند.
بیرون از main، هنوز داخل آکولاد کلاس، بنویسید static void mark(int n). بدنه یک چاپ دارد: System.out.println(n);. روی این صفحه void را نگه دارید. دارید دیدهشدن نام را میبینید، نه مقدار برگشتی. قبل از کامپایل فایل را ذخیره کنید. برنامهٔ کامل اول در جعبهٔ بعدی است.
Gate.java با mark
این نسخهای است که اول کامپایل میکنید. main صدا را نگه میدارد. mark چاپی را نگه میدارد که از n استفاده میکند.
public class Gate {
public static void main(String[] args) {
mark(4);
}
static void mark(int n) {
System.out.println(n);
}
}
از پوشهای که Gate.java آنجاست، javac Gate.java را اجرا کنید. وقتی پرانتز و آکولاد و نقطهویرگولها جور باشند، javac خودش خطی نمینویسد. بعد java Gate را اجرا کنید — نه java Gate.java. پسوند .java را از فرمان دوم بردارید. همین دو فرمان در Windows و macOS کار میکند. برنامه باید یک خط چاپ کند و تمام شود: 4. منتظر تایپ شما نمیماند. اگر ترمینال منتظر ماند، هنوز nextLine از تمرین قدیمی داخل فایل است. آن را پاک کنید و mark(4); بههمراه متد mark بالا را نگه دارید.
اجرا را یکبار به ترتیب ببینید. Java از main شروع میکند. صدا زدن mark(4) عدد 4 را داخل پارامتر n میفرستد. داخل mark، println(n) مینویسد 4. وقتی mark تمام میشود، نام n هم تمام میشود. main هرگز نامی به نام n نداشته. عدد 4 بهصورت مقدار از صدا عبور کرد. نام n وارد main نشد.
اگر بعد از صدا داخل main بنویسید System.out.println(n);، javac میگوید نماد n را پیدا نمیکند. آن خطا همان درس است که کار میکند: n هرگز در main اعلام نشده. با برداشتن آن خط از main درستش کنید، یا اگر آنجا به نام محلی نیاز دارید نام دیگری اعلام کنید. انتظار نداشته باشید پارامترِ mark خودش در main ظاهر شود.
یک نام محلی کنار پارامتر
داخل mark میتوانید نام تازهای اعلام کنید که پارامتر نیست. آن نام محلی فقط بین آکولادهای mark زندگی میکند. بدنه را طوری عوض کنید که برچسبی نگه دارد و برچسب و n را در یک خط چاپ کند، یا برای دمو متد کوتاه دومی نگه دارید — روی این صفحه جعبهٔ بعدی بهجای آن، رد کردن نام از main را نشان میدهد که مسیر معمول مبتدی است.
امید رایج مبتدی این است که نامی که در main اعلام شده خودکار داخل همهٔ متدهای کلاس دیده شود. روی این شکل، چنین نیست. اگر main داشته باشد int room = 4; و mark بدون گرفتن آن بخواهد room را چاپ کند، javac داخل mark نام room را پیدا نمیکند. درستش رد کردن مقدار است: mark(room); با همان اعلام mark(int n).
یک نام محلی main را به mark بدهید
داخل main بنویسید int room = 4;. صدا بزنید mark(room);. داخل mark همچنان n را چاپ کنید. صفحه باز هم 4 نشان میدهد. نام محلی در main همان room است. نام پارامتر در mark همان n است. دو نام جدا در دو جا هستند. آنچه سفر میکند مقدار 4 است.
public class Gate {
public static void main(String[] args) {
int room = 4;
mark(room);
}
static void mark(int n) {
System.out.println(n);
}
}
دوباره کامپایل و اجرا کنید: javac Gate.java، بعد java Gate. هنوز یک خط میبینید: 4. اگر room را به 9 عوض کنید و بدنهٔ متد را دست نزنید، صفحه 9 نشان میدهد. متد هنوز هر مقداری را که در n رسیده چاپ میکند. main میتواند room را هم چاپ کند اگر آنجا System.out.println(room); بگذارید — آن نام مال همانجاست. main هنوز نمیتواند n را چاپ کند.
اگر mark نام محلی خودش را اعلام کند — مثلاً داخل آکولاد int tag = 1; — آن tag برای main نادیدنی است. تلاش برای System.out.println(tag); در main به همان دلیل چاپ n از main شکست میخورد. آکولادهای mark برای نامهای داخلشان دیوارند.
دیوار از چه محافظت میکند
جداسازی را با واژههای ساده بخوانید. نامهایی که در main اعلام میشوند در main میمانند مگر مقدارشان را داخل یک صدا بفرستید. نامهایی که در mark اعلام میشوند — پارامتر و محلی — در mark میمانند. صدا مقدار میبرد، نه خودِ نامها را. اضافهبار صفحهٔ قبل مهارت دیگری است: چند متد با یک نام متد مشترک. محدودهٔ نام دربارهٔ این است که یک متغیر یا پارامتر کجا در سورس اجازهٔ ظاهر شدن دارد.
یک دموی باقیماندهٔ Sign با چند متد paint ممکن است در همان فایل بماند و اگر main هنوز paint("ok") صدا بزند صفحه را گیج کند. main را تا صدای mark که دارید آزمایش میکنید خلوت کنید. mark را داخل آکولاد main تو در تو ننویسید. متدها داخل کلاس، کنار main مینشینند.
نوشتن System.out.println("n"); در main حرف n داخل نقلقول را چاپ میکند. پارامتر را چاپ نمیکند. وقتی مقدار رسیده از صدا را میخواهید، println(n) را داخل mark نگه دارید. نوشتن mark(); با پرانتز خالی وقتی سر هنوز میگوید mark(int n) شکست میخورد — صدا باید یک int بفرستد، چه لفظی مثل 4 چه محلی مثل room.
قبل از recursion
میتوانید mark(int n) بنویسید، داخل همان متد n را چاپ کنید، و n را بیرون از main نگه دارید. میتوانید در main نام room اعلام کنید و room را به mark بدهید. صفحه مقداری را نشان میدهد که از صدا عبور کرده. نامها خودبهخود از آکولاد نشت نمیکنند. صفحهٔ بعد recursion است؛ آنجا متد خودش را با آرگومان کوچکتر صدا میزند تا شرط توقف زنجیره را تمام کند.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود