مقدمه‌ای بر مفهوم شیئ‌گرایی در برنامه‌نویسی


در این مرحله از آموزش قصد داریم تا نگاه دقیق‌تری به مفاهیم شیئ‌گرایی داشته باشیم که در زبان‌های برنامه‌نویسی متعددی همچون جاوا مورد استفاده قرار می‌گیرند. در حقیقت، شیئ‌گرایی عبارت است از پارادایم‌ها و استراتژی‌هایی که در زبان‌های برنامه‌نویسی بسیاری به کار گرفته می‌شوند. پایه و اساس رویکرد Object Oriented Programming یا به اختصار OOP به معنی «برنامه‌نویسی شیئ‌گرا» این است که نگاه برنامه‌نویسان به توسعۀ نرم‌افزار به نگاه ایشان به دنیای واقعی نزدیک‌تر گردد. به طور مثال، سیستمی را در نظر بگیرید که با استفاده از آن به مطالعۀ این آموزش مشغول هستید که می‌توان گفت این سیستم یک Object یا شیئ در دنیای واقعی می‌باشد و این در حالی است که شیئ متعلق به شما با کامپیوتر (شیئ) مورد استفاده توسط مؤلف این دوره بسیار متفاوت می‌باشد.

برای درک بهتر مفهوم شیئ‌گرایی مثالی را مد نظر قرار می‌دهیم که در آن قرار است تا یک آپارتمان ده طبقه بسازیم که برای هر یک از طبقات آن یکسری ویژگی خاص و منحصربه‌فرد تعریف کرده‌ایم بدین صورت که تصمیم داریم تا رنگ دیوارهای طبقۀ اول را سفید و درهای آن را کِرِم رنگ کنیم و رنگ دیوارهای طبقۀ هفتم را صورتی و برای درهای آن نیز رنگ سفید را انتخاب کرده‌ایم و به همین ترتیب برای سایر طبقات نیز برخی ویژگی‌های منحصربه‌فرد دیگر در نظر گرفته‌ایم.

در حقیقت، در این مثال، هر یک از طبقه‌های آپارتمان مانند یک آبجکت در زبان برنامه‌نویسی شیئ‌گرایی همچون جاوا است بدین معنی که با وجود در نظر گرفتن یکسری ویژگی خاص برای هر یک از طبقات، باز هم کلیۀ طبقات آپارتمان از یکسری ویژگی‌ ثابت و مشترک همچون اتاق خواب، سرویس، آشپزخانه و پنجره برخوردار هستند. در زبان برنامه‌نویسی جاوا نیز یک کلاس دقیقاً چنین نقشی را ایفا می‌کند؛ به عبارت دیگر، در یک برنامۀ نوشته‌شده به زبان جاوا کلاس‌‌ها به منزلۀ یک نقشۀ خانه‌ هستند که هر یک از طبقات آپارتمان از روی آن‌ها ساخته می‌شوند و هر یک علی‌رغم داشتن یک پِلن ثابت، دارای یکسری ویژگی منحصربه‌فرد هستند که اصطلاحاً به هر یک از آن‌ها یک آبجکت (شییٔ) گفته می‌شود.

در زبان‌های برنامه‌نویسی شیئ‌گرا نیز دولوپرها یک کلاس با خصوصیات مد نظر خود را تعریف کرده سپس از روی کلاس تعریف‌شده یکسری آبجکت می‌سازند به طوری که هر یک از آبجکت‌ها دارای زیربنایی یکسان اما نمایی متفاوت می‌باشند! به طور کلی، ویژگی شیئ‌گرایی یکسری مزایای منحصربه‌فرد را به زبان برنامه‌نویسی جاوا افزوده است که در ادامه قصد داریم تا در قالب مثال آپارتمان به بررسی برخی از ویژگی‌های این سَبک برنامه‌نویسی در زبان جاوا بپردازیم.

در مثال فوق،‌ ابتدا یک نقشۀ کلی (کلاس) برای آپارتمان طراحی می‌کنیم و در ادامه تصمیم می‌گیریم که تعدادی از طبقات آپارتمان خود را سه‌خوابه و برخی از آن‌ها را چهارخوابه بسازیم که در اینجا می‌توانیم از روی پِلن (کلاس) اصلی دو کلاس دیگر تحت عناوین سه‌خوابه و چهارخوابه طراحی کنیم که ویژگی‌های کلاس اصلی را اصطلاحاً به ارث ببرند. در زبان برنامه‌نویسی جاوا این مفهوم Inheritance به معنی «ارث‌بری» نام دارد که در آن به کلاس اولیه اصطلاحاً Superclass یا «کلاس اصلی» گفته می‌شود و بدین ترتیب کلاس‌های مربوط به طبقات آپارتمان سه‌خوابه و چهارخوابه نیز Subclass یا «کلاس زیرشاخه» می‌باشند. به عبارت دیگر، می‌توان گفت که کلاس اصلی تحت عنوان کلاس Parent (والد) بوده و کلاس‌های زيرشاخۀ آن کلاس Child (فرزند) نامیده می‌شوند و نکته‌ای که در اینجا می‌باید حتماً مد نظر قرار دهیم این است که در برنامه‌نویسی هر کلاس به تنهایی منجر به ایجاد چیزی نخواهد شد چرا که یک مفهوم انتزاعی است و چنانچه بخواهیم نمود عینی یک کلاس را ببینیم، به یک آبجکت از روی آن نیاز داریم.

در حقیقت، پیش از رواج زبان‌های برنامه‌نویسی شیئ‌گرا، برنامه‌نویسان در صورت نیاز به اِعمال تغییر در بخشی از برنامۀ خود مجبور به تغییر بخش‌های قابل‌توجهی از برنامۀ مد نظر بودند اما پس از توسعۀ زبان‌های برنامه‌نویسی شیئ‌گرایی همچون جاوا این مشکل به کلی حل شد چرا که با اِعمال تغییر روی یک کلاس، کلیۀ ویژگی‌های مربوط به آبجکت‌های ساخته‌شده از روی آن کلاس نیز تغییر می‌کنند به طوری که ویژگی‌های جدید و تغییرات اِعمال‌شده را از کلاس جدید به ارث می‌برند.

برای درک بهتر مفهوم شیئ‌گرایی به ذکر مثال دیگری می‌پردازیم که در آن از سیستم‌های کامپیوتری به عنوان نمونه استفاده می‌کنیم. در واقع، هر یک از سیستم‌های کامپیوتری شیئی هستند که می‌توانند چندین شیئ دیگر همچون هارد، سی‌پی‌یو، رم و غیره را در خود جای دهند و هر یک دارای یکسری Attribute به معنی «خصیصه» می‌باشند که آن‌ها را از دیگر کامپیوترها مجزا می‌سازند (برای مثال، یک سیستم دارای سی‌پی‌یوی هشت‌هسته‌ای می‌باشد.) در عین حال، هر کامپیوتر دارای یکسری به اصطلاح Behavior یا «عملکرد» نیز می‌باشد. به طور مثال، هر سیستمی می‌تواند یک فایل صوتی را پخش کند که رفتاری مختص یک شیئ از نوع کامپیوتر می‌باشد در حالی که اشیاء دیگری در دنیای واقعی مانند یخچال دارای چنین رفتاری نمی‌باشند (معادل فارسی واژۀ Behavior «رفتار» است اما به منظور انتقال بهتر مفهوم، معنای «عملکرد» را در این آموزش در نظر گرفته‌ایم.)

به طور کلی، در برنامه‌نویسی شیئ‌گرا، اشیاء داری سه ویژگی می‌باشند که در ادامه به توصیف هر یک می‌پردازیم:

- ویژگی اول اینکه هر شیئ دارای یک به اصطلاح Identity یا «شناسۀ» خاص خود است (به طور مثال، دو انسان که به منزلۀ شیئ هستند را در نظر بگیرید که هر دو دارای یکسری خصوصیت مشترک همچون داشتن دست، پا، قدرت تفکر و غیره می‌باشند و همچنین عملکرد مشابهی مانند حرف زدن، دویدن و سایر مواردی از این دست دارند اما در عین حال دارای دو شناسۀ مجزا می‌باشند به طوری که ممکن است مثلاً نام یکی احسان و دیگری نیما باشد.)

- ویژگی دوم مربوط به Attribute یا «خصیصه» می‌باشد که برای مثال می‌توان به قد احسان معادل عددی همچون 185 سانتی‌متر اشاره کرد در حالی که قد نیما 176 سانتی‌متر می‌باشد.

- در نهایت، ویژگی سوم تحت عنوان Behavior یا «عملکرد» آن شیئ می‌باشد به طوری که مثلاً احسان می‌تواند به خوبی پیانو بنوازد اما نیما یک برنامه‌نویس خوب است.

همچنین توجه داشته باشیم که اشیاء ساخته‌شده در برنامه می‌باید حتماً ریشه در جایی داشته باشند؛ به عبارت بهتر، آبجکت‌ها به خودی خود ایجاد نمی‌شوند بلکه کلاس‌ها هستند که به آبجکت‌ها معنا و مفهوم می‌دهند. در حقیقت، در برنامه‌نویسی شیئ‌گرا به منظور ساخت آبجکت ابتدا نیاز داریم تا کلاس متناظر آن را تعریف کرده سپس آبجکت مورد نیاز خود را از روی آن بسازیم. به عبارت دیگر، کلاسی با مجموعۀ خصیصه‌ها و رفتارهای مد نظر خود تعریف کرده و بدین ترتیب مشخص می‌کنیم که آبجکت‌های ساخته‌شده از روی آن دارای چه خصیصه‌ها و رفتارهایی باشند و از همین روی می‌توان گفت که هر آبجکت به منزلۀ یک Instance یا «نمونۀ عینی» از کلاس متناظرش می‌باشد.

در برنامه‌نویسی به ساخت آبجکت از روی کلاس اصطلاحاً Instantiation یا «نمونه‌سازی» گفته می‌شود و همان‌طور که پیش‌تر اشاره کردیم، برای ساخت آبجکت از روی یک کلاس در ابتدا نیاز به تعریف کلاس مربوطه داریم. به علاوه، نکته‌ای که در اینجا می‌باید مد نظر قرار دهیم این است که برنامه‌نویسان الزماً مجبور نیستند تا کلیۀ کلاس‌ها را خودشان توسعه دهند چرا که طراحان زبان‌های برنامه‌نویسی بسیاری از آن‌ها را در قالب یکسری کلاس از پیش تعریف‌شده در زبان برنامه‌نویسی مربوطه پیاده‌سازی کرده‌اند که به راحتی می‌توان با به‌کارگیری کلاس یا کلاس‌های مد نظر از قابلیت‌های آن‌ها بهره‌مند شد اما در عین حال چنانچه بخواهیم کلاسی متناسب با ویژگی‌های مورد نیاز خود را بنویسیم، همواره می‌باید چهار مفهوم اصلی را در تعریف آن مد نظر قرار دهیم که عبارتند از Encapsulation ،Inheritance ،Polymorphism و 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» در خروجی چاپ شود.

در دنیای واقعی یک شیئ جدای از دیگر اشیاء می‌تواند وجود داشته باشد، با دیگر اشیاء تعامل داشته باشد و حتی چند شیئ با یکدیگر ادغام شده تا شیئ جدیدی را به وجود آورند. در واقع این فصل از دوره ی آموزش زبان برنامه‌نویسی جاوا به منزله ی شروع کار با Object ها یا همان اشیاء در این زبان برنامه‌نویسی خواهد بود. از اینجای آموزش به بعد خواهیم دید که چه طور می‌توان یک Object با خصوصیات منحصربه‌فردی ایجاد کرده و همچنین خواهیم دید که به چه نحوی می‌توان آن شیئ را در دیگر جاهای برنامه خود مورد استفاده قرار داد.

در حقیقت اگر یک برنامه نوشته شده در جاوا را به منزله تعدادی Object در نظر بگیریم که در کنار یکدیگر قرار گرفته اند تا یک Object بزرگ تر از خود را -که کار خاصی را می‌تواند انجام دهد- بسازد (به عبارتی یک برنامه)، به سهولت خواهیم توانست Object ها را در یک زبان برنامه نوسی شیئ گرا درک کنیم. در حقیقت با ساخت یک شیئ در برنامه خود، خواهیم توانست آن شیئ را به هر تعداد دفعه که بخواهیم مورد استفاده قرار دهیم و یا حتی چنانچه نیاز به تغییری در یکی از Attribute ها یا همان خصوصیات شیئ خاص داشته باشیم، صرفاً با اِعمال تغییر در آن شیئ به خصوص، تغییر اِعمال شده در کل برنامه لحاظ خواهد شد.

از سوی دیگر با ایجاد Object ها در یک کدنویسی، امکان Debug کردن یا مشکل یابی نیز برای ما راحت تر خواهد شد چرا که به جای درگیر کردن خود با کل پروژه، صرفاً می‌توانیم Object یی که به آن مشکوک هستیم را Debug کنیم. برای آشنایی بیشتر با فرایند دیباگ کردن، می‌توانید به آموزش فرایند دیباگ کردن در برنامه‌نویسی به چه معنا است؟ از دوره ی آموزش اصول برنامه‌نویسی در سکان آکادمی مراجعه نمایید.

در حقیقت یک شیئ در زبان‌های برنامه‌نویسی شیئ گرا دارای دو چیز تحت عنوان Attribute و Behavior می‌باشد. به طور خلاصه Attribute ها عبارتند از ویژگی هایی که یک شیئ را از شیئ دیگری در برنامه متفاوت می سازند. منظور از Behavior ها همان کارهایی است که یک Object می‌تواند انجام دهد. در زبان برنامه‌نویسی جاوا، Object ها با استفاده از یک Class ایجاد می شوند. در حقیقت یک Class در برگیرنده کلیه Attribute ها و Behavior هایی است که یک Object می‌تواند داشته باشد.

اکنون نیاز است پروژه‌ای تحت عنوان OOP به معنی "برنامه‌نویسی شیئ گرایی" ایجاد می‌کنیم سپس کلاسی به نام MyClass در آن می‌سازیم. در این مرحله کد ما می‌باید به شکل زیر باشد:

public class MyClass {
}

نام این کلاس MyClass به معنی "کلاس من" می‌باشد. حال اگر یک Object از روی این کلاس ایجاد کنیم، آن Object هیچ کاری برای ما نخواهد کرد زیرا که دارای هیچ گونه Attribute و یا Behavior یی نمی‌باشد. معنی لغوی واژه public معادل است با "عمومی" و یا "همگانی" و در زبان برنامه‌نویسی جاوا نیز معنی این کلیدواژه چیزی مرتبط با همین معانی است. با قرار دادن کلیدواژه public قبل از نام یک کلاس -و یا حتی یک متد- این دستور را به کامپایلر می‌دهیم که این کلاس یا متد قابل دسترسی توسط دیگر بخش‌های برنامه نیز خواهد بود (در آموزش‌های آتی، با دیگر سطوح کنترل همچون private و protected نیز آشنا خواهیم شد.) حال نیاز داریم تا یک Attribute برای شیئ خود تعریف کنیم. این کار را می‌توان از طریق انواع متغیرها که پیش از این مورد بررسی قرار گرفتند انجام داد. از این رو، یک متغیر از جنس int در کلاس خود به اسم number به معنی "شماره" ایجاد کرده و مقدار اختصاص داده شده به آن را معادل با 1 در نظر می‌گیریم. حال نوبت به ایجاد یک Behavior برای کلاس خود می‌رسد. برای همین منظور از یک Method استفاده خواهیم کرد. به طور خلاصه وظیفه متدها انجام یکسری کارها است که به آن‌ها محول می‌شود و در این برنامه وظیفه متدی که ما می‌سازیم این است که در پنجره ی کنسول، جمله‌ای را به نمایش در آورد. متد ما به شکل زیر خواهد بود:

public void showSomething() {
}

در واقع با قرار دادن کلیدواژه public قبل از نام متد این دستور را به کامپایلر می‌دهیم که این متد از هر کجای برنامه قابل دسترس خواهد بود. کلیدواژه void به این معنی است که این متد از یکسو قرار است دستوری انجام دهد و از سوی دیگر این متد قرار نیست که هیچ گونه Data یا داده ای را بازگرداند. به عبارت دیگر این متد چیزی را return نخواهد کرد (در آموزش‌های آتی با مبحث return به طور مفصل آشنا خواهیم شد.) سپس نام متد تحت عنوان showSomething به معنی "چیزی را نشان بده" قرار می‌دهیم.

نکته
چیزی که برنامه‌نویسان کل دنیا در نام‌گذاری متدها همواره مد نظر دارند این است که این نام‌گذاری می‌باید با یک فعل شروع شود چرا که وظیفه اصلی متدهای انجام یکسری کار است پس بهتر است که نحوه نام‌گذاری آن‌ها هم به نحوی باشد که گویای وظیفه شان باشد. در این مثال از آنجا که این متد قرار است متنی را روی صفحه مانیتور به نمایش در آورد، پس نام آن را نیز با واژه show به معنی "نشان دادن" آغاز می‌کنیم.

پس از نام متد علامت () را قرار داده سپس علامت های { } را قرار می‌دهیم (هر کاری که متدها قرار است انجام دهند می‌باید مابین دو علامت { } قرا گیرند و چنانچه نیاز است متد دارای Attribute های اضافی باشد می‌باید داخل ( ) قرار گیرند که تحت عنوان پارامترها یا آرگومان های آن متد شناخته می شوند.) حال داخل دو علامت { } دستوری را می‌نویسیم که جمله "این اولین متد ساخت من است" را داخل کنسول به نمایش در آورد. در این مرحله کد ما به شکل زیر تکمیل خواهد شد:

public class MyClass {
    int number = 1;
    public void showSomething() {
        System.out.println("This is my method " + number + " created by me.");
    }
}

در واقع دستوری که داخل ;()System.out.println قرار گرفته است در وهله ی اول عبارت This is my method را چاپ کرده سپس مقدار متغیر برنامه تحت عنوان number را به آن اضافه کرده و در نهایت عبارت .created by me را به آخر استرینگ اضافه می‌کند. در محیط برنامه‌نویسی اکلیپس دکمه ی Run را برای اجرای برنامه می‌زنیم و خروجی برنامه همانند تصویر زیر خواهد بود:

ظاهراً برنامه ما با مشکلی مواجه می‌باشد چرا که اکلیپس از اجرای برنامه خودداری کرده و از برنامه ما خطا می‌گیرد. عبارتی که در تصویر بالا مشاهده می‌شود حاکی از آن است که "کلاس ما دارای یک نقطه شروع نمی‌باشد". همان‌طورکه قبلا هم توضیح داده شد، یک برنامه جاوا برای آن بتواند اجرا شود نیاز به یک متد از جنس main دارد که در قسمت زیر قابل‌مشاهده است:

public static void main(String[] args) {
}

در واقع، هر آنچه که در این متد قرار گیرد، به محض اجرای برنامه فرا خوانده خواهد شد. تا این جای کار ما یک کلاس ایجاد کرده‌ایم که می‌توانیم از روی آن یک Object یا شیئ ایجاد کنیم. برای این منظور نیاز داریم تا یک کلاس جدید ایجاد کرده که به منزله نقطه آغازین برنامه ما خواهد بود و در کلاس جدید خود از روی کلاس MyClass یک شیئ جدید ایجاد کرده و مورد استفاده قرار دهیم. برای ایجاد یک کلاس جدید همانند تصویر زیر عمل می‌کنیم:

در این تصویر فلش قرمز رنگ نشان دهنده نام پروژه‌ای است که در ابتدای هر آموزش ایجاد می‌کنیم که در این آموزش نام OOP در نظر گرفته شده است. فلش سبز رنگ نشانگر پکیجی است که در حین ایجاد یک کلاس جدید می‌توانیم ایجاد کنیم. به خاطر داشته باشیم که وظیفه هر پکیج این است که به ما کمک کند تا کلاس هایی را که نیاز است تا در یک گروه باشند را در کنار یکدیگر قرار دهیم. حال اگر در حین ساخت یک کلاس نام پکیجی در نظر گرفته نشود، اکلیپس به طور خودکار این کار را تحت عنوان default package به معنی "پکیج پیش‌فرض" انجام خواهد داد. در این مرحله روی نام پیکج کلیک راست کرده و از پنجره‌ای که باز می‌شود گزینه New را انتخاب کرده و از پنجره دوم گزینه Class را انتخاب می‌کنیم که در تصویر فوق با فلش آبی رنگ نشان داده شده است (به منظور ساخت یک کلاس جدید از منوی File می‌توان گزینه New سپس گزینه Class را انتخاب کرد.) در ادامه، نامی که برای کلاس خود در نظر می‌گیریم می‌تواند MySecondClass به معنی "کلاس دوم من" باشد. سپس پیش از زدن دکمه Finish گزینه (public static void main(String[] args را تیک می‌زنیم. فایده این کار این است که دیگر نیازی نیست تا متد main را به طور دستی وارد کلاس جدید خود کنیم. پس از ایجاد کلاس جدید، کلاس به طور خودکار در پنجره‌ای جدید باز شده کد داخل آن به شکل زیر خواهد بود:

public class MySecondClass {
    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }
}

همان‌طور که قبلا توضیح داده شده است، کلیه ی کامنت‌ها از داخل کد قابل حذف بوده و هیچ تأثیری در فرایند اجرای برنامه نخواهند داشت. این کلاس جدیدی که ایجاد کردیم بر خلاف کلاس اول، این قابلیت را دارا است که هر آنچه در آن قرار گیرد را اجرا کند چرا که داخل آن متد main گنجانده شده است. حال می‌خواهیم تا یک Object از روی کلاس قبلی خود در این کلاس ایجاد کنیم. برای این منظور کد خود را به شکل زیر تکمیل می‌کنیم:

public class MySecondClass {
    public static void main(String[] args) {
        MyClass newObject = new MyClass();
    }
}

برای این کار نام کلاس قبلی خود را نوشته سپس برای این Object یی که می‌خواهیم بسازیم یک نام می‌باید در نظر بگیریم. نامی که در اینجا می‌توان در نظر گرفت newObject به معنی "شیئ جدید " می‌باشد (لازم به ذکر است که هر نامی برای این شیئ می‌توان در نظر گرفت.) سپس یک علامت مساوی قرار داده و از آنجا که قرار است یک شیئ جدید ایجاد کنیم، از کلیدواژه ی new استفاده خواهیم کرد و در نهایت مجدداً نام کلاسی که می‌خواهیم از روی آن یک شیئ درست کنیم را نوشته و یک علامت ;() هم در انتهای آن قرار می‌دهیم. برای آن که این شیئ ساخته شده را بتوانیم مورد استفاده قرار دهیم، می‌باید نام Object یی که ساخته‌ایم را نوشته سپس بعد از آن یک نقطه قرار داده و در نهایت نام متدی که در کلاس قبلی ایجاد کرده بودیم را بنویسیم که در این صورت کد ما به شکل زیر در خواهد آمد (به عبارت دیگر، این متد قرار گرفته داخل کلاس است که می‌توان کاری مثل نمایش یک متن را عملی سازد که بدون فرا خواندن این متد، شیئ ما هیچ کاری نخواد کرد):

public class MySecondClass {
    public static void main(String[] args) {
        MyClass newObject = new MyClass();
        newObject.showSomething();
    }
}

تا اینجای کار ما توانسته ایم با موفقیت یک شیئ جدید بسازیم که کلیه Attribute ها و Behavior های خود را از کلاس MyClass به ارث خواهد برد. در این آموزش ما توانستیم یک Object جدید ایجاد کرده که در صورت اجرای برنامه، خروجی آن به شکل زیر خواهد بود:

حال اگر به Class اول خود بازگردیم و تغییری در متد آن ایجاد کنیم، این تغییر بلافاصله در Object یی که از روی آن کلاس ایجاد کردیم اِعمال خواهد شد. به طور مثال عبارت داخل دستور ;()System.out.println که در کلاس MyClass قرار دارد را به عبارت !This is a change به معنی"این یک تغییر است!" تبدیل می‌کنیم. پس از Save کردن این تغییر اِعمال شده، مجدداً به Class دوم رفته و برنامه را اجرا می‌کنیم:

public class MyClass {
    int number = 1;
    public void showSomething() {
        System.out.println("This is a change!");
    }
}

خروجی برنامه به شکل زیر خواهد بود:

مشاهده می‌کنیم که به چه راحتی می‌توان در زبان برنامه‌نویسی جاوا یک Object ایجاد کرده و Attribute ها و Behavior های مرتبط با آن را در لحظه تغییر داد و تغییرات لحاظ شده را در کل برنامه خود دید.

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


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
جاوا پور :)
جاوا پور :)
۱۳۹۷/۱۰/۲۳
سلام ممنون از آموزش های روان و مثال های کاملا قابل درکتون :)
یه سوال داشتم
! وقتی که ما خط MyClass newClass=new MyClass(); رو می نویسیم، شی ساخته شده دقیقا کدوم بخش این کده؟ یعنی میخوام ببینم با نوشتن MyClass newClass; به عنوان یک متغیر مثلا، در واقع داریم یک شی از اون کلاس میسازیم یا سمت دوم تساوی در واقع شی رو میسازه؟
سوالم رو از اونجایی مطرح میکنم که این خط رو، هم به شکل بالا و هم به این صورت که هر طرفِ تساوی جداگانه در قسمتی از یک برنامه به کار رفته اند، دیدم ولی نمیدونم تفاوت این ها در چیه.ممنن میشم اگر راهنماییم کنید
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۰/۲۴
آقای مرادی ممنونممممممم
AmirAemi
AmirAemi
۱۳۹۵/۱۱/۱۰
با سلام
و عرض خسته نباشید به تک تک اعضای این سایت فوق العاده
میخواستم بدونم معادل دستور system("cls") که در CPP استفاده می شود ، در جاوا چیست؟
کاربر میهمان
معینمن یک کاربر مهمان هستم
۱۳۹۵/۰۶/۲۵
سلام.من در کلاس دوم وقتی فراخوانی ابجکت ایجاد شده رو کامنت میکنم بازم برنامه خروجی داره...علتش چیه؟
Hamid
Hamid
۱۳۹۵/۰۶/۲۲
آقا سلام خسته نباشید ،من قصد دارم برنامه نویسی اندروید شروع کنم ،میخاستم بدونم این آموزش ها لازمه؟
کاربر میهمان
علیمن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۰۷
سلام ، میخام دوتا آرایه رو که نوعش مشخص نیست رو با هم جمع کنم ، این آرایه هارو هم قراره که بعدا از کاربر بگیرم
حالا برنامه رو نوشتم و ورودی رو هم دو تا آرایه قرار دادم (Object array1,Object array2) که دوتاشون ، نوعشون رو Object قرار دادم . اما وقتی مینویسم array1+array2 خطا میده که دوتا object رو نمیشه با هم جمع کرد.چکار کنم ؟
کاربر میهمان
رضا رستمیمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۲۰
واقعا عالی بود لذت بردم انشا الله خدا هر چی میخواین بهتون بده
محمد عقبائی فرهنگ
محمد عقبائی فرهنگ
۱۳۹۴/۰۸/۱۷
سلام و خسته نباشید. ببخشید چرا من وقتی تو کلاس MyClass کلمه کلیدی public رو ور میدارم بازم هیچ تغیری نمیکنه و برنامه کار میکنه؟ یعنی منظورم اینه بازم کلاس اصلی برنامه به کلاس MyClass کیتونه دسترسی داشته باشه
کاربر میهمان
Miladمن یک کاربر مهمان هستم
۱۳۹۴/۰۸/۱۷
در جواب AliJCVD باید گفت هر برنامه باید یک متد Main برای استارت داشته باشد، در نتیجه شما در کلاس MyClass اگر متد Main را تعریف کنید، برنامه برای شروع کارش سردرگم میشه، چون یکبار دیگه هم توی کلاس MySecondClass به برنامه گفتیم از این نقظه برنامه رو شروع کن.
AliJCVD
AliJCVD
۱۳۹۴/۰۸/۰۳
سلام و عرض خسته نباشید
میخواستم بدونم علت اینکه تو کلاس اول یعنی MyClass قسمت (public static void main(String[] args رو وارد نکردیم ؟ من خودم وارد کردم تو برنامه و از public void showsomthing ایراد گرفت موقع کامپایل کردن!!
لطفا توضیح بدید چرا اینجوریه! ممنون میشم