در این آموزش قصد داریم تا متغیرهای Local و Field در زبان برنامهنویسی جاوا را معرفی کرده و به بررسی تفاوتهای مابین آنها بپردازیم. در واقع، متغیرهای لوکال داخل متدِ تعریفشده در کلاس ایجاد میشوند و صرفاً داخل همان متد در دسترس میباشند اما متغیرهای فیلد خارج از تمامی متدها در کلاس تعریف شده و با ساخت آبجکت از روی کلاس مربوطه میتوان از طریق سایر نقاط برنامه به آنها دسترسی داشت.
به منظور درک مفاهیم تئوری فوق، پروژهای تحت عنوان LocalVariablesvsFields در محیط اکلیپس ایجاد کرده و کلاسی تحت عنوان Constructor
در آن میسازیم که در ابتدا کدی به صورت زیر خواهیم داشت:
public class Constructor {
}
همانطور که در ابتدای آموزش اشاره کردیم، متغیرهای تعریفشدهِ داخل یک متد متغیرهای لوکال میباشند و فقط از داخل متد مربوطه میتوان به آنها دسترسی پیدا کرد که برای روشن شدن این مطلب، مثال زیر را مد نظر قرار میدهیم:
public class Constructor {
public void testMethodOne() {
int number;
}
}
در کد فوق، متدی تحت عنوان ()testMethodOne
تعریف کرده و در آن با استفاده از دیتا تایپ int
متغیری به نام number
ایجاد کردهایم. در حقیقت، متغیر number
یک متغیر لوکال یا متغیر داخلی است که تنها از داخل متدِ ()testMethodOne
میتوان به آن دسترسی پیدا کرد. از سوی دیگر، اگر فرض کنیم که یک کلاس جدید ایجاد میکنیم تا از کلاس Constructor
ارثبری کند، در چنین شرایطی صرفاً میتوانیم به متد ()testMethodOne
دسترسی داشته باشیم و نمیتوانیم کنترل متغیر number
در این متد را در دست بگیریم که برای درک بهتر این مطلب یک کلاس دیگر به نام ActionClass
ایجاد میکنیم که از کلاس Constructor
ارثبری میکند سپس آبجکتی از روی کلاس Constructor
تحت عنوان objectOne
میسازیم:
public class ActionClass extends Constructor {
public static void main(String[] args) {
Constructor objectOne = new Constructor();
}
}
حال میخواهیم تا به متغیر number
تعریفشدهِ در متد ()testMethodOne
داخل کلاس Constructor
دست پیدا کنیم که برای این منظور آبجکت objectOne
را نوشته سپس یک علامت .
قرار میدهیم و به محض درج علامت .
نرمافزار اکلیپس به صورت خودکار نام مواردی را نمایش میدهد که برای این آبجکت قابلدسترسی هستند که از کلاس Constructor
نیز صرفاً متد ()testMethodOne
در دسترس میباشد و به هیچ وجه نام متغیر number
در میان موارد مذکور نمایش داده نمیشود.
حال اگر بخواهیم تا متغیری را خارج از یک متد و در بدنهٔ کلاس تعریف کنیم، این متغیر به مثابۀ یک متغیر فیلد خواهد بود که از سایر بخشهای برنامه نیز در دسترس میباشد که در ادامه به منظور درک بهتر تفاوت متغیرهای فیلد و لوکال، کد فوق را به صورت زیر بازنویسی میکنیم:
public class Constructor {
int number;
public void testMethodOne() {
}
}
در کد فوق، خارج از متد ()testMethodOne
در کلاس Constructor
و با استفاده از دیتا تایپ int
متغیری به نام number
تعریف کردهایم که این متغیر برای کلیۀ متدهای داخل کلاس مذکور قابلدسترسی میباشد. حال مجدداً به کلاس ActionClass
بازگشته و این بار به محض درج علامت .
پس از نام آبجکت ساختهشده از روی کلاس Constructor
میبینیم که نرمافزار اکلیپس علاوه بر متد ()testMethodOne
نام متغیر number
از کلاس Constructor
را نیز نمایش میدهد.
با این تفاسیر، میتوان گفت که متغیرهای فیلد یا متغیرهای تعریفشده در بدنهٔ کلاس برای دیگر بخشهای برنامه نیز قابلدسترسی میباشند مضاف بر اینکه با ساخت آبجکتهای متفاوتی از روی کلاس مربوطه میتوانیم به تعداد دلخواه به متغیرهای فیلد تعریفشده در کلاس دسترسی یافته و آنها را مقداردهی نماییم و این در حالی است که مقدار در نظر گرفتهشده برای هر یک از متغیرها برابر با مقداری میباشد که در ساخت آبجکت مربوطه از روی کلاس بدان منتسب کردهایم که برای روش شدن این مطلب، کلاس ActionClass
را مد نظر قرار داده و آن را به صورت زیر بازنویسی میکنیم:
public class ActionClass extends Constructor {
public static void main(String[] args) {
Constructor objectOne = new Constructor();
objectOne.number = 12;
Constructor objectTwo = new Constructor();
objectTwo.number = 20;
}
}
همانطور که در کد فوق ملاحظه میکنیم، دو آبجکت تحت عناوین objectOne
و objectTwo
از روی کلاس Constructor
ساختهایم سپس از طریق آبجکت اول به متغیر فیلد number
از کلاس ActionClass
دسترسی پیدا کرده و مقدار آن را معادل با 12 قرار میدهیم و در ادامه از طریق آبجکت دوم نیز به فیلد مذکور دسترسی پیدا کرده و عدد 20 را بدان منتسب میکنیم.
همانطور که ملاحظه میکنیم، دو مقدار متفاوت را به یک متغیر منتسب کردهایم که این موضوع منجر به بروز اروری نشده است چرا که هر آبجکت ساختهشدهِ از روی کلاس Constructor
به طور مجزا مورد استفاده قرار گرفته است و شاید به همین دلیل باشد که نام دیگر متغیرهای فیلد Instance Variables است که به منزلۀ متغیرهایی میباشند که در هر Instance یا «نمونه» از یک کلاس مورد استفاده قرار میگیرند.