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


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

پایه و اساس رویکرد 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!

همان‌طور كه مشاهده می‌کنیم، به راحتی می‌توان در زبان برنامه‌نویسی جاوا یک آبجکت از روی کلاسی ایجاد کرده و اتریبیوت‌ها و متدهای مرتبط با آن را تغییر داد که این تغییرات بلافاصله در تمامی آبجکت‌های ساخته‌شده از روی کلاس مذکور نیز اِعمال می‌گردد.

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

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
۱۳۹۸/۰۵/۲۷
ممنونم از آموزش بی نقص شما.
جاوا پور :)
جاوا پور :)
۱۳۹۷/۱۰/۲۳
سلام ممنون از آموزش های روان و مثال های کاملا قابل درکتون :)
یه سوال داشتم
! وقتی که ما خط MyClass newClass=new MyClass(); رو می نویسیم، شی ساخته شده دقیقا کدوم بخش این کده؟ یعنی میخوام ببینم با نوشتن MyClass newClass; به عنوان یک متغیر مثلا، در واقع داریم یک شی از اون کلاس میسازیم یا سمت دوم تساوی در واقع شی رو میسازه؟
سوالم رو از اونجایی مطرح میکنم که این خط رو، هم به شکل بالا و هم به این صورت که هر طرفِ تساوی جداگانه در قسمتی از یک برنامه به کار رفته اند، دیدم ولی نمیدونم تفاوت این ها در چیه.ممنن میشم اگر راهنماییم کنید
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۰/۲۴
آقای مرادی ممنونممممممم
کاربر میهمان
علیمن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۰۷
سلام ، میخام دوتا آرایه رو که نوعش مشخص نیست رو با هم جمع کنم ، این آرایه هارو هم قراره که بعدا از کاربر بگیرم
حالا برنامه رو نوشتم و ورودی رو هم دو تا آرایه قرار دادم (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 ایراد گرفت موقع کامپایل کردن!!
لطفا توضیح بدید چرا اینجوریه! ممنون میشم