در این مرحله از آموزش قصد داریم تا نگاه دقیقتری به مفاهیم شیئگرایی داشته باشیم که در زبانهای برنامهنویسی متعددی همچون جاوا مورد استفاده قرار میگیرند. در حقیقت، شیئگرایی عبارت است از پارادایمها و استراتژیهایی که در زبانهای برنامهنویسی بسیاری به کار گرفته میشوند.
پایه و اساس رویکرد Object Oriented Programming یا به اختصار OOP به معنی «برنامهنویسی شیئگرا» این است که نگاه برنامهنویسان به توسعۀ نرمافزار به نگاه ایشان به دنیای واقعی نزدیکتر گردد. به طور مثال، سیستمی را در نظر بگیرید که با استفاده از آن به مطالعۀ این آموزش مشغول هستید که میتوان گفت این سیستم یک Object یا شیئ در دنیای واقعی میباشد و این در حالی است که شیئ متعلق به شما با کامپیوتر (شیئ) مورد استفاده توسط مؤلف این دوره بسیار متفاوت میباشد.
برای درک بهتر مفهوم شیئگرایی مثالی را مد نظر قرار میدهیم که در آن قرار است تا یک آپارتمان ده طبقه بسازیم که برای هر یک از طبقات آن یک سری ویژگی خاص و منحصربهفرد تعریف کردهایم بدین صورت که تصمیم داریم تا رنگ دیوارهای طبقۀ اول را سفید و درهای آن را کِرِم رنگ کنیم و رنگ دیوارهای طبقۀ هفتم را صورتی و برای درهای آن نیز رنگ سفید را انتخاب کردهایم و به همین ترتیب برای سایر طبقات نیز برخی ویژگیهای منحصربهفرد دیگر در نظر گرفتهایم. در حقیقت، در این مثال هر یک از طبقههای آپارتمان مانند یک آبجکت در زبان برنامهنویسی شیئگرایی همچون جاوا است بدین معنی که با وجود در نظر گرفتن یک سری ویژگی خاص برای هر یک از طبقات، باز هم کلیۀ طبقات آپارتمان از یک سری ویژگی مشترک همچون اتاق خواب، سرویس، آشپزخانه و پنجره برخوردارند.
در زبان برنامهنویسی جاوا نیز یک کلاس دقیقاً چنین نقشی را ایفا میکند؛ به عبارت دیگر، در یک برنامۀ نوشتهشده به زبان جاوا کلاسها به منزلۀ یک نقشۀ خانه هستند که هر یک از طبقات آپارتمان از روی آنها ساخته میشوند و هر یک، علیرغم داشتن یک پِلن ثابت، دارای یک سری ویژگی منحصربهفرد هستند که اصطلاحاً به هر یک از آنها یک آبجکت (شییٔ) گفته میشود.
در زبانهای برنامهنویسی شیئگرا دولوپرها یک کلاس با خصوصیات مد نظر خود را تعریف کرده سپس از روی کلاس تعریفشده یک سری آبجکت میسازند به طوری که هر یک از آبجکتها دارای زیربنایی یکسان اما نمایی متفاوت میباشند! به طور کلی، ویژگی شیئگرایی یک سری مزایای منحصربهفرد را به زبان برنامهنویسی جاوا افزوده است که در ادامه قصد داریم تا در قالب مثال آپارتمان به بررسی برخی از ویژگیهای این سَبک برنامهنویسی در زبان جاوا بپردازیم.
در مثال فوق، ابتدا یک نقشۀ کلی (کلاس) برای آپارتمان طراحی میکنیم و در ادامه تصمیم میگیریم که تعدادی از طبقات آپارتمان خود را سهخوابه و برخی از آنها را چهارخوابه بسازیم که در اینجا میتوانیم از روی پِلن (کلاس) اصلی دو کلاس دیگر تحت عناوین سهخوابه و چهارخوابه طراحی کنیم که ویژگیهای کلاس اصلی را اصطلاحاً به ارث ببرند. در زبان برنامهنویسی جاوا این مفهوم Inheritance به معنی «ارثبری» نام دارد که در آن به کلاس اولیه اصطلاحاً Superclass یا «کلاس اصلی» گفته میشود و بدین ترتیب کلاسهای مربوط به طبقات آپارتمان سهخوابه و چهارخوابه نیز Subclass یا «کلاس زیرشاخه» میباشند. به عبارت دیگر، میتوان گفت که کلاس اصلی تحت عنوان کلاس Parent (والد) بوده و کلاسهای زيرشاخۀ آن کلاس Child (فرزند) نامیده میشوند و نکتهای که در اینجا میباید حتماً مد نظر قرار دهیم این است که در برنامهنویسی هر کلاس به تنهایی منجر به ایجاد چیزی نخواهد شد چرا که یک مفهوم کاملاً انتزاعی است و چنانچه بخواهیم نمود عینی یک کلاس را ببینیم، نیاز به ساخت یک آبجکت از روی آن داریم.
در حقیقت، پیش از رواج زبانهای برنامهنویسی شیئگرا، برنامهنویسان در صورت نیاز به اِعمال تغییر در بخشی از برنامۀ خود مجبور به تغییر بخشهای قابلتوجهی از برنامۀ مد نظر بودند اما پس از توسعۀ زبانهای برنامهنویسی شیئگرایی همچون جاوا این مشکل تا حد بسیاری حل شد چرا که با اِعمال تغییر روی یک کلاس، کلیۀ ویژگیهای مربوط به آبجکتهای ساختهشده از روی آن کلاس نیز تغییر میکنند به طوری که ویژگیهای جدید و تغییرات اِعمالشده را از کلاس جدید به ارث میبرند.
برای درک بهتر مفهوم شیئگرایی به ذکر مثال دیگری میپردازیم که در آن از سیستمهای کامپیوتری به عنوان نمونه استفاده میکنیم. در واقع، هر یک از سیستمهای کامپیوتری شیئی هستند که میتوانند چندین شیئ دیگر همچون هارد، سیپییو، رم و غیره را در خود جای دهند و هر یک دارای یک سری به اصطلاح Attribute به معنی «خصیصه» میباشند که آنها را از دیگر کامپیوترها مجزا میسازند (برای مثال، یک سیستم دارای سیپییوی هشتهستهای میباشد.) در عین حال، هر کامپیوتر دارای یک سری به اصطلاح Behavior یا «عملکرد» نیز میباشد. به طور مثال، هر سیستمی میتواند یک فایل صوتی را پخش کند که رفتاری مختص یک شیئ از نوع کامپیوتر میباشد در حالی که اشیاء دیگری در دنیای واقعی مانند یخچال دارای چنین رفتاری نمیباشند (معادل فارسی واژۀ Behavior «رفتار» است اما به منظور انتقال بهتر مفهوم، معنای «عملکرد» را در این آموزش در نظر گرفتهایم.)
به طور کلی، در برنامهنویسی شیئگرا، آبجکتها داری سه ویژگی کلیدی میباشند که در ادامه به توصیف هر یک میپردازیم:
- ویژگی اول این که هر شیئ دارای یک به اصطلاح Identity یا «شناسۀ» خاص خود است. به طور مثال، دو انسان که به منزلۀ شیئ هستند را در نظر بگیرید که هر دو دارای یک سری خصوصیت مشترک همچون داشتن دست، پا، قدرت تفکر و غیره میباشند و همچنین عملکرد مشابهی مانند حرف زدن، دویدن و سایر مواردی از این دست دارند اما در عین حال دارای دو شناسۀ مجزا میباشند به طوری که ممکن است مثلاً نام یکی احسان و دیگری نیما باشد.
- ویژگی دوم مربوط به Attribute یا «خصیصه» میباشد که برای مثال میتوان به قد احسان معادل عددی همچون 185 سانتیمتر اشاره کرد در حالی که قد نیما 176 سانتیمتر میباشد.
- در نهایت هم ویژگی سوم تحت عنوان Behavior یا «عملکرد» آن شیئ میباشد به طوری که مثلاً احسان میتواند به خوبی پیانو بنوازد اما نیما یک برنامهنویس خوب است.
همچنین توجه داشته باشیم که اشیاء ساختهشده در برنامه میباید حتماً ریشه در جایی داشته باشند؛ به عبارت بهتر، آبجکتها به خودی خود ایجاد نمیشوند بلکه کلاسها هستند که به آبجکتها معنا و مفهوم میدهند. در حقیقت، در برنامهنویسی شیئگرا به منظور ساخت آبجکت ابتدا نیاز داریم تا کلاس متناظر آن را تعریف کرده سپس آبجکت مورد نیاز خود را از روی آن بسازیم. به عبارت دیگر، کلاسی با مجموعۀ خصیصهها و رفتارهای مد نظر خود تعریف کرده و بدین ترتیب مشخص میکنیم که آبجکتهای ساختهشده از روی آن دارای چه خصیصهها و رفتارهایی باشند و از همین روی میتوان گفت که هر آبجکت به منزلۀ یک Instance یا «نمونه» از کلاس متناظرش میباشد.
در برنامهنویسی به ساخت آبجکت از روی کلاس اصطلاحاً Instantiation یا «نمونهسازی» گفته میشود و همانطور که پیشتر اشاره کردیم، برای ساخت آبجکت از روی یک کلاس در ابتدا نیاز به تعریف کلاس مربوطه داریم. به علاوه، نکتهای که در اینجا میباید مد نظر قرار دهیم این است که برنامهنویسان الزماً مجبور نیستند تا کلیۀ کلاسها را خودشان توسعه دهند چرا که طراحان زبانهای برنامهنویسی بسیاری از آنها را در قالب یک سری کلاس از پیش تعریفشده در زبان برنامهنویسی مربوطه پیادهسازی کردهاند که به راحتی میتوان با بهکارگیری کلاس یا کلاسهای مد نظر از قابلیتهای آنها بهرهمند شد اما در عین حال چنانچه بخواهیم کلاسی متناسب با ویژگیهای مورد نیاز خود را بنویسیم، همواره میباید چهار مفهوم اصلی را در تعریف آن مد نظر قرار دهیم که عبارتند از Polymorphism ،Inheritance ،Encapsulation و Abstraction که میتوان آنها را به عنوان ویژگیهای کلیدی شیئگرایی قلمداد کرد (به منظور به خاطر سپردن چهار عنصر اصلی ساخت کلاس که در بالا بدان اشاره کردیم، میتوان حرف اول هر یک از چهار کلمه را گرفته و کلمۀ A PIE به معنی «یک کلوچه» را به خاطر سپرد.)
آشنایی با مفهوم Abstraction
یکی از ویژگیهای برنامهنویسی شیئگرا، بهکارگیری مفهومی تحت عنوان Abstraction است که در اینجا به توصیف مفهوم این واژه در قالب یک مثال از دنیای واقعی میپردازیم. به طور مثال، شرایطی را در نظر بگیرید که از دوست خود خواهش میکنید تا لیوان آبی را از روی میز به شما بدهد که در این صورت صرفاً نمود خارجی میز را مد نظر قرار داده و هرگز از دوست خود نمیخواهید تا مثلاً لیوان آبی از روی میز قهوهای، با عرض دو متر، طول سه متر و ارتفاع یکونیم متر را به شما بدهد بلکه صرفاً مفهوم کلی میز را مد نظر قرار دادهاید.
Abstraction در برنامهنویسی نیز به همین صورت است که در حین نوشتن کلاسها دقیقاً میباید یک مفهوم کلی را در نظر بگیریم. به طور مثال، فرض کنید که برنامهای برای یک باشگاه بدنسازی مینویسیم که برای این منظور نیاز به تعریف یک کلاس مرتبط با ثبتنام ورزشکاران داریم و در برنامۀ خود قصد داریم تا کارهایی همچون ثبتنام، ویرایش اطلاعات ورزشکاران، ثبت فیش واریزی و غیره را از طریق کلاس مذکور انجام دهیم که در پیادهسازی چنین کلاسی میباید صرفاً یک سری مفهوم کلی را در نظر گرفته و در صورت لزوم آبجکتهایی به صورت اصطلاحاً Customized از روی آن ایجاد کنیم تا نیازمان را برآورده سازند.
آشنایی با مفهوم Encapsulation
تاکنون بسیار برایمان پیش آمده است که سرما خورده و به پزشک مراجعه کرده باشیم تا دارویی جهت بهبود حال خود تهیه کنیم و برخی از این داروها به شکل کپسول بودهاند که در این مثال وظیفۀ کپسول نگهداری دارو و محافظت از آن است. در برنامهنویسی شیئگرا نیز Encapsulation مفهومی مشابه دارا است به طوری که یک سری Attribute و Behavior تعریفشده برای آبجکت ساختهشده از روی کلاس را در کنار یکدیگر نگهداری میکند اما در عین حال Encapsulation وظیفهای فراتر از این موضوع داشته و امکانی را برای دولوپرها فراهم میکند تا بدین طریق از میان مجموعۀ اتریبیوتهای یک آبجکت، تنها برخی اتریبیوتهای مورد نیاز را در توسعۀ نرمافزار مربوطه انتخاب کرده و در دسترس سایر بخشهای برنامه قرار دهند؛ به عبارت دیگر، سایر بخشهای برنامه از میان مجموعۀ اتریبیوتهای یک آبجکت صرفاً به یک سری اتریبیوت خاص دسترسی خواهند داشت.
سؤالی که در اینجا ممکن است برای برخی برنامهنویسان مبتدی پیش آید این است که «چه لزومی دارد که ما چیزی را در کلاس خود ایجاد کنیم سپس خود را از دسترسی به آن منع کنیم؟» که در پاسخ به این پرسش میتوان گفت با این کار وابستگی مابین بخشهای مختلف برنامه را به حداقل میرسانیم به نحوی که ایجاد یک تغییر کوچک در بخشی از برنامه منجر به تخریب دیگر بخشها نگردد.
نکته |
Encapsulation یا پنهانسازی بخشی از کلاس از سایر بخشهای برنامه را هر چه بیشتر در برنامۀ خود رعایت کنیم مدیریت برنامه در درازمدت راحتتر خواهد شد؛ بدین معنی که در برنامههای نسبتاً بزرگ هر چه وابستگی مابین بخشهای مختلف برنامه کمتر باشد، دولوپرها در توسعه و نگهداری سورسکد مربوطه با سردرگمی کمتری مواجه خواهند شد. |
آشنایی با مفهوم Inheritance
Inheritance در برنامهنویسی شیئگرا امکانی را در اختیار برنامهنویسان قرار میدهد تا بدین وسیله به جای نوشتن یک کلاس از ابتدا، برخی از ویژگیهای کلاس جدید را از کلاس دیگری اصطلاحاً به ارث ببرند. برای درک بهتر این موضوع، به مثال مربوط به آپارتمان باز میگردیم که در آن یک نقشۀ کلی برای آپارتمان ده طبقه داشتیم که به منزلۀ یک کلاس برای کلیۀ طبقات محسوب میشد. در چنین شرایطی اگر بخواهیم برخی طبقات را مثلاً سهخوابه یا چهارخوابه بسازیم، به هیچ وجه نیازی به نوشتن یک کلاس از پایه نداریم بلکه به راحتی میتوانیم یک کلاس با خصوصیت سه یا چهار خوابه بنویسیم که دیگر خصوصیات خود را از کلاس اصلی یا همان Superclass به ارث ببرد که در این صورت چنانچه تغییری در Superclass اِعمال کنیم، تغییر ایجادشده در هر یک از کلاسهای زیرشاخۀ سهخوابه و چهارخوابه نیز اِعمال خواهد شد (در زبان برنامهنویسی جاوا هر یک از کلاسها در آن واحد قابلیت ارثبری از صرفاً یک کلاس اصلی را دارند.)
آشنایی با مفهوم Polymorphism
Polymorphism به معنی «چندفرمی» یا «چندریختی» است که برای روشن شدن مفهوم آن، به ذکر مثالی از دنیای واقعی میپردازیم. به طور مثال، حیوان سگ را مد نظر قرار میدهیم که چنانچه این حیوان دادهای از جنس بوی آدم غریبه به حس بویاییاش منتقل شود «واق واق» میکند و در صورت اِستشمام بوی دادهای از جنس گوشت، بزاقش ترشح میشود به علاوه این که در صورت احساس بوی صاحبش دُمش تکان میدهد. در این مثال، در هر سه حالت حس بویایی سگ است که فعالیت میکند و تنها تفاوت در نوع دادهای است که به حس بویایی این حیوان منتقل شده است.
در زبان برنامهنویسی جاوا نیز برای مثال میتوان به علامت +
اشاره کرد که دقیقاً ویژگی مشابه به مثال فوق را دارا است به طوری که چنانچه دو متغیر از جنس عدد را با عملگر +
جمع کنیم، حاصلجمع آن دو عدد در خروجی ریترن میشود که برای مثال حاصل جمع دو عدد 5 و 7 به صورت 12 = 7 + 5 بوده و عدد 12 در خروجی ریترن میشود اما این در حالی است که اگر از این علامت در کنار دو متغیر از جنس استرینگ استفاده کنیم، استرینگهای منتسب به متغیرهای مذکور در کنار یکدیگر قرار گرفته و در معرض دیدمان قرار میگیرند. برای مثال، میتوان دو استرینگ «Hello» و «World» را نام برد که اِعمال عملگر +
روی آنها منجر بدین میشود تا دو استرینگ به صورت «Hello + World» در کنار یکدیگر قرار گرفته و اصطلاحاً با یکدیگر Concate (الحاق) شوند و در نهایت استرینگ «HelloWorld» در خروجی چاپ شود.
در دنیای واقعی، یک شیئ میتواند جدای از دیگر اشیاء یا در تعامل با آنها باشد و حتی چندین شیئ میتوانند با یکدیگر ادغام شده و شیئ جدیدی را به وجود آورند.
به طور کلی، از جمله مزایای تعریف کلاس و ساخت آبجکت از روی آن به منظور استفاده در جایجای برنامه میتوان به سهولت استفاده از متدها و اتریبیوتهای کلاس مد نظر اشاره کرد که با ساخت آبجکت به تعداد دلخواه از روی کلاس مد نظر میتوان به متد یا اتریبیوت مورد نظر خود از کلاس مربوطه دسترسی پیدا کرد به علاوه این که اِعمال تغییر در هر یک از اتریبیوتهای کلاس مد نظر به راحتی روی آبجکت ساختهشده از روی آن اِعمال میشود.
از سوی دیگر برنامهنویسی با استفاده از سبک شیئگرایی منجر بدین میشود که فرآیند دیباگ کردن سورسکد به سادگی انجام پذیرد چرا که به جای درگیر کردن خود با کل پروژه میتوانیم به رفع ارورهای احتمالی در کلاس مورد نظر بپردازیم (برای آشنایی بیشتر با فرایند دیباگ کردن، میتوانید به آموزش فرایند دیباگ کردن در برنامهنویسی به چه معنا است؟ از دوره ی آموزش اصول برنامهنویسی در سکان آکادمی مراجعه نمایید.)
اکنون به منظور درک بهتر هر یک از مفاهیم کلاس و آبجکت نیاز است تا پروژهای تحت عنوان OOP ایجاد میکنیم سپس کلاسی به نام MyClass
در آن میسازیم. در این مرحله کد ما میباید به شکل زیر باشد:
public class MyClass {
}
حال اگر آبجکتی از روی کلاس مذکور ایجاد کنیم، آبجکت ساختهشده قابلیت استفاده به منظور انجام هیچ تَسکی را نخواهد داشت چرا که کلاس مربوطه دارای هیچ گونه اتریبیوت و متدی نمیباشد.
همانطور که میبینیم، به منظور تعریف کلاس از کیورد public
استفاده کردهایم که معنای لغوی آن معادل «عمومی» بوده و در زبان برنامهنویسی جاوا به منظور تعریف سطح دسترسی پابلیک مورد استفاده قرار میگیرد بدین معنی که کلاس مذکور از دیگر بخشهای برنامه نیز قابلدسترسی خواهد بود (در آموزش آشنایی با انواع سطوح دسترسی در زبان برنامهنویسی جاوا با دیگر سطوح دسترسی همچون private
و protected
نیز آشنا خواهیم شد.)
حال نیاز داریم تا یک اتریبیوت برای کلاس فوق تعریف کنیم که برای این منظور میتوانیم با استفاده از دیتا تایپ مورد نظر خود متغیرهایی تعریف کرده و در ادامه با ساخت آبجکت از روی کلاس به اتریبیتوت مد نظر دسترسی بیایم. بنابراین با استفاده از دیتا تایپ int
متغیری به نام number
در کلاس فوق تعریف کرده و عدد 1 را بدان اختصاص میدهیم و در ادامه یک متد برای کلاس تعریف میکنیم و در ادامه میتوانیم متد مورد نظر را روی آبجکت ساختهشده از روی آن فراخوانی نماییم. به طور خلاصه، وظیفۀ متدها انجام یک سری تَسکهای محولشده به آنها در برنامه است که در کد زیر متدی به منظور نمایش استرینگی فرضی در کنسول تعریف میکنیم:
public void showSomething() {
}
در واقع، با قرار دادن کلیدواژۀ public
قبل از نام متد، این دستور را به کامپایلر میدهیم که متد ()showSomething
از تمامی نقاط برنامه در دسترس خواهد بود مضاف بر این که کلیدواژۀ void
نیز بدین معنی است که متد مذکور از یکسو قرار است تا یک سری دستور را اجرا نماید و از سوی دیگر هیچ گونه دیتایی را در خروجی ریترن نمیکند.
نکته |
در نامگذاری متدها همواره از واژگانی به صورت فعل استفاده میکنیم چرا که وظیفۀ اصلی متدها انجام یک سری کار است و از همین روی بهتر است تا نامگذاری آنها هم به نحوی باشد که گویای وظیفهشان باشد. |
با توجه به آنچه که در نکتۀ فوق بیان کردیم، متد ()showSomething
نیز وظیفۀ نمایش یک استرینگ در کنسول را دارا است و از همین روی نام متد مذکور را با واژۀ «show» آغاز کردهایم. پس از نام متد نیز علامتهای ( )
را قرار داده سپس علائم { }
را قرار میدهیم و در ادامه دستورات مد نظر به منظور اجرا در صورت فراخوانی متد مذکور را داخل علائم { }
مینویسیم.
در این مرحله از کار، داخل علائم { }
مربوط به متد ()showSomething
دستوری به منظور نمایش استرینگی با مضمون «اولین متد تعریفشده توسط من» را مینویسیم که برای این منظور کدی به صورت زیر خواهیم داشت:
public class MyClass {
int number = 1;
public void showSomething() {
System.out.println("This is method " + number + " created by me.");
}
}
در واقع، دستور سطر چهارم در وهلۀ اول استرینگ «This is method» را در کنسول چاپ کرده سپس مقدار منتسب به متغیر number
را با آن کانکت کرده و در نهایت مقدار متغیر مذکور نیز با استرینگ «.created by me» کانکت شده و استرینگ نهایی در کنسول چاپ میشود. حال اجرای برنامۀ فوق منجر به بروز اروری به صورت زیر میشود:
Selection does not contain a main type
در واقع، دریافت چنین اروری بدین معنی است که کلاس مورد نظر دارای یک نقطۀ شروع نمیباشد و در آموزشهای پیشین نیز توضیح دادیم که یک برنامۀ نوشتهشده به زبان جاوا برای اجرا نیاز به یک متد ()main
دارد که ساختار این متد به صورت زیر است:
public static void main(String[] args) {
}
در واقع، متد ()main
نقطۀ آغازین برنامه بوده و هر آنچه که در این متد قرار گیرد، به محض اجرای برنامه اجرا میشود. تا به این مرحله از آموزش کلاسی تحت عنوان MyClass
ایجاد کردهایم که میتوانیم از روی آن یک آبجکت بسازیم که برای این منظور هم نیاز داریم تا یک کلاس جدید در پروژۀ OOP ایجاد کرده و در آن متد ()main
را به منزلۀ نقطه آغازین برنامه تعریف کنیم سپس در کلاس جدید خود از روی کلاس MyClass
یک شیئ جدید ایجاد کرده و مورد استفاده قرار دهیم.
برای ایجاد یک کلاس جدید نیز در پروژۀ OOP کلاسی تحت عنوان MySecondClass
در داخل پکیج مربوط به کلاس MyClass
میسازیم که در این مرحله تیک گزینۀ public static void main را نیز میزنیم تا به صورت خودکار متد ()main
در این کلاس تعریف شود (توجه داشته باشیم که در حین تعریف کلاس جدید چنانچه پکیج خاصی را مد نظر قرار ندهیم، اکلیپس به طور پیشفرض پکیج مربوط به کلاس پیشین را برای کلاس جدید نیز در نظر میگیرد که بدین ترتیب هر دو کلاس در یک پکیج قرار میگیرند.) حال پس از ایجاد کلاس جدید کدی به صورت زیر خواهیم داشت:
public class MySecondClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
همانطور که در آموزشهای پیشین توضیح دادیم، کلیۀ کامنتهای کد فوق قابلحذف بوده و هیچ تأثیری در فرآیند اجرای برنامه ندارند. به علاوه، کلاس فوق بر خلاف کلاس قبل به دلیل دارا بودن متد ()main
قابلیت اجرا داشته و کدهای داخلی آن اجرا میشوند. بنابراین آبجکتی از روی کلاس MyClass
در داخل کلاس فوق میسازیم و برای این منظور کد فوق را به صورت زیر تکمیل میکنیم:
public class MySecondClass {
public static void main(String[] args) {
MyClass newObject = new MyClass();
}
}
همانطور كه میبینیم، ابتدا نام کلاس را ذکر کرده و در ادامه نام آبجکت مد نظر تحت عنوان newObject
را مینویسیم سپس با استفاده از کیود new
آبجکتی جدید از روی کلاس MyClass
ساخته و در انتها علائم ;()
را درج کرده و با استفاده از عملگر =
آبجکت مذکور را به newObject
منتسب مینماییم. اکنون به منظور استفاده از آبجکت ساختهشده از روی کلاس والد، میباید نام آبجکت را نوشته سپس یک .
قرار داده و در نهایت نام متد مورد نظر از کلاس مربوطه را درج نماییم. بنابراین در مثال فوق میتوانیم آبجکت newObject
را نوشته سپس یک علامت .
قرار داده و متد ()showSomething
را به صورت زیر فراخوانی کنیم:
public class MySecondClass {
public static void main(String[] args) {
MyClass newObject = new MyClass();
newObject.showSomething();
}
}
با اجرای برنامۀ فوق، آبجکتی جدید از روی کلاس MyClass
تحت عنوان newObject
ساخته شده و بدین ترتیب میتوانیم به کلیۀ اتریبیوتها و متدهای کلاس MyClass
دسترسی داشته باشیم و همانطور که میبينيم در دستور سطر چهارم متد ()showSomething
روی آبجکت ساختهشده از روی کلاس مذکور فراخوانی شده و منجر به چاپ استرینگ زیر در خروجی میگردد:
This is method 1 created by me.
در این مرحله، به کلاس MyClass
بازگشته و تغییری در متد آن ایجاد میکنیم که این تغییر بلافاصله در آبجکت ساختهشده از روی آن کلاس مذکور نیز اِعمال میشود. به طور مثال، استرینگ تعریفشده داخل متد ()println
را به صورت زیر به استرینگ «!This is a change» تغییر میدهیم:
public class MyClass {
int number = 1;
public void showSomething() {
System.out.println("This is a change!");
}
}
پس از سِیو کردن تغییرات اِعمالشده در کلاس MyClass
مجدد به کلاس MySecondClass
بازگشته و آن را اجرا میکنیم که در خروجی خواهیم داشت:
This is a change!
همانطور كه مشاهده میکنیم، به راحتی میتوان در زبان برنامهنویسی جاوا یک آبجکت از روی کلاسی ایجاد کرده و اتریبیوتها و متدهای مرتبط با آن را تغییر داد که این تغییرات بلافاصله در تمامی آبجکتهای ساختهشده از روی کلاس مذکور نیز اِعمال میگردد.