ایجاد اشیاء و استفاده از متدهای آنها در جاوا
با تعریف کردن یک کلاس، به خودی خود، هیچ شیء ای ایجاد نخواهد شد.
یک شیء در حقیقت یک نمونه از یک کلاس است؛ و برای ایجاد یک شیء باید دو کار را انجام دهیم. ابتدا باید یک نوع را مشخص کنیم و سپس باید یک شناسه را بنویسیم. درست مانند زمانی که می خواهیم یک متغیر ایجاد کنیم. پس از اینکه این کار را انجام دادیم، برای شیء ایجاد شده، در حافظه فضا اختصاص داده خواهد شد. بعنوان مثال، اگر به خاطر داشته باشید، برای ایجاد یک متغیر صحیح(integer)، به صورت زیر عمل می کردیم:
int someValue;
حالا برای ایجاد یک شیء از کلاس Employee نیز به صورت زیر عمل می کنیم:
Employee someEmployee;
وقتی که یک متغیر از نوع int به صورت int someValue تعریف می کنیم، در حقیقت به کامپایلر اعلام می کنیم که یک متغیر صحیح به نام someValue وجود دارد و تو باید در حافظه برای آن فضا درنظر بگیری.
وقتی که اعلام می کنید که متغیر someEmployee یک شیء یا نمونه از کلاس Employee است، در حقیقت به کامپایلر می گویید که شناسه ی someEmployee را به این شیء اختصاص بده. اما برای این شیء که نامش someEmployee است، در حافظه فضا در نظر گرفته نمی شود. زیرا اختصاص یافتن فضا تنها برای متغیرهای اولیه به طور اتوماتیک انجام می شود، نه برای اشیاء.
برای اینکه به یک شیء در حافظه فضا اختصاص یابد، باید از کلمه ی کلیدی new استفاده کنیم. بنابراین با اجرای دو دستور زیر، فضای کافی به شیء someEmployee اختصاص خواهد یافت:
Employee someEmployee;
someEmployee = new Employee();
شما همچنین می توانید با نوشتن یک خط کد، فضای کافی را به شیء someEmployee اختصاص دهید، به صورت زیر:
Employee someEmployee = new Employee();
در دستور بالا، واژه ی Employee نوعِ شیء است و واژه ی someEmployee نام این شیء را مشخص می کند. در این دستور، از واژه ی someEmployee برای رجوع به شیء ایجاد شده استفاده می شود. (یعنی واژه ی someEmployee نام فضایی از حافظه است که این شیء در آن نگهداری می شود). به واژه ی Employee عبارت reference type اطلاق می گردد.
کلمه ی کلیدی new باعث می شود که یک فضای جدید در حافظه ی کامپیوتر برای شیء someEmployee ایجاد شود. مقداری که در دستور بالا، به واژه ی someEmployee انتساب داده می شود، یک آدرس در حافظه است که شیء someEmployee در آن قرار گرفته است.
در بخش آخر دستور بالا، درست پس از کلمه ی کلیدی new، واژه ی ()Employee قرار دارد که در جلوی آن یک جفت پرانتز وجود دارد، درست مثل یک متد، که همواره در جلوی آن یک جفت پرانتز وجود دارد. در حقیقت این واژه، نام یک متد است که از کلاس Employee برای ما یک شیء می سازد. متد ()Employee یک سازنده(constructor) است. سازنده ها، یک نوع متد ویژه هستند که اشیاء را ایجاد و مقدار دهی می کنند.
شما قادر هستید تا سازنده های دلخواه خود را ایجاد کنید. روش انجام این کار در مقالات بعدی نشان داده خواهد شد. اما وقتی که شما برای یک کلاس، یک سازنده() نمی نویسید، جاوا برای شما یک سازنده تولید می کند و همواره نام آن را مشابه با نام کلاسی که می خواهیم از آن شیء ایجاد کنیم، قرار می دهد.
پس از اینکه از یک کلاس نمونه گیری کردیم و یک شیء ایجاد شد، قادر هستیم تا به متدهای آن دسترسی داشته باشیم. برای دسترسی به متدهای یک شیء ابتدا نام آن شیء را می نویسیم و سپس یک علامت نقطه قرار می دهیم و سپس نام متد مورد نظر را می نویسیم بعلاوه ی یک جفت پرانتز.
بعنوان مثال، عکس 3.19 یک اپلیکیشن جاوا را نشان می دهد که از کلاس Employee دو شیء را نمونه گیری می کند. این دو شیء را clerk و driver نام گذاری کرده ایم. هر یک از این اشیاء، در یک زمان، از متدهای ()setEmpNum و ()getEmpNum استفاده می کنند. اپلیکیشن DeclareTwoEmployees قادر است تا از این متدها استفاده کند زیرا این متدها از نوع public هستند. و به دلیل اینکه این متدها غیر استاتیک هستند، باید برای استفاده از آنها، از کلاس Employee نمونه گیری شود. عکس 3.20 خروجی این اپلیکیشن را نشان می دهد:
درک مفهوم پنهان سازی داده ها(data hiding)
در داخل کلاس DeclareTwoEmployees برای اینکه بتوانید در هر شیء ایجاد شده از کلاس Employee مقدار متغیر عضوی empNum را تنظیم(set) و یا دریافت(get) کنید، باید از متدهای ()setEmpNum و ()getEmpNum که از نوع public هستند، استفاده کنید. زیرا شما نمی توانید به طور مستقیم به متغیر عضوی empNum که از نوع private است، دسترسی داشته باشید. بعنوان مثال، استفاده از دستور زیر مجاز نمی باشد:
clerk.empNum = 789;
اگر دستور بالا را اجرا کنید، با خطای زیر مواجه خواهید شد:
"empNum has private access in Employee"
خطای بالا، به این معنی است که شما در داخل کلاس DeclareTwoEmployees به متغیر عضوی empNum دسترسی ندارید.
در صورتی که به جای private، متغیر empNum را از نوع public تعریف کرده بودیم، آنگاه می توانستیم بطور مستقیم به آن دسترسی داشته باشیم اما با این کار، یکی از اصول مهم برنامه نویسی شیء گرا را نقض می کنیم. این اصل، همان پنهان سازی داده ها، با استفاده از کپسوله سازی است. متغیرهای عضوی، معمولا باید از نوع private باشند، در این صورت یک برنامه ی جانبی تنها می تواند از طریق متدهای public به این متغیر دسترسی داشته باشد.
ممکن است بپرسید که استفاده از متدها ی public برای set و get کردن مقادیر چه ضرورتی دارد، در صورتی که می توانیم به طور مستقیم این کار را انجام دهیم؟
پاسخ: زیرا به وسیله ی این متد ها، می توانیم عملیات های دیگری را نیز بر روی مقدار مورد نظر انجام دهیم. مثلا می توانیم متد ()setEmpNum را طوری بنویسیم که داده ها ورودی را اعتبار سنجی کند. و سپس آنها را در متغیر عضوی ذخیره کند. اما در حالت انتساب مستقیم، این کار امکان پذیر نیست.
ایجاد متدهایی که عمل set و get را انجام دهند، باعث می شود که در آینده، کارها برای ما ساده تر شوند. نوشتن متدهای set و get برای هر متغیر عضوی(در داخل یک کلاس)، ضروری نیست.
- نوشته شده توسط احسان عباسی
- بازدید: 4419