آشنایی با متغیرهای Local و Field در زبان برنامه‌نویسی جاوا


در این آموزش قصد داریم تا متغیرهای 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 یا «نمونه» از یک کلاس مورد استفاده قرار می‌گیرند.

دانلود فایل‌های تمرین


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
elias.maghami
elias.maghami
۱۳۹۷/۰۵/۰۴
awliiiiiiiiiii
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۱/۰۷
سلام
من خودم اولش که این مطلب رو دیدم حسابی گیج شدم و حتی سرچ کردم تفاوت import و extend رو!!!
لطفا به جای اینکه کلاس ActionClass رو از کلاس Constructor، extend کنید،
کلاس Constructor رو در کلاس ActionClass import کنید.
چون با توجه به مفهوم وراثت برای ساخت شیء از روی یک کلاس، اصلا نیازی به ارث بری از اون نیست! فقط import کردن اون کلاس کافیه.
با تشکر از شما
mohammad m
mohammad m
۱۳۹۵/۰۱/۲۵
ممنون از اموزش های خوبتان