آموزش قدم به قدم جاوا – قسمت نهم

در قسمت نهم از آموزش جاوا و پس از جلسه هشتم در مورد مبانی برنامه‌نویسی شی‌گرا، مباحث مربوطه را پی می‌گیریم.

تعریف کلاس‌ها

شکل کلی تعریف یک کلاس در جاوا به صورت زیر است:

class نام کلاس {

}

  1. نام کلاس نمی‌تواند با عدد شروع شود.
  2. محتویات کلاس بین دو آکولاد آن قرار می‌گیرند.
  3. طبق یک قرارداد بین برنامه‌نویسان جاوا نام کلاس باید با حروف بزرگ شروع شود. البته رعایت این قرارداد الزامی نیست اما بهتر است به آن عمل شود.

برای ایجاد یک کلاس در برنامه eclipse روی فولدر src کلیک کرده و از منوی New گزینه Class را انتخاب کنید. همانطور که در تصویر زیر می‌بینید اسم کلاس ما Car است. توجه داشته باشید که گزینه package را انتخاب کنید (در ادامه با آن آشنا خواهید شد). حالا روی Finish کلیک کنید.

joop2

کد کلاس Car (اتومبیل) در حال حاضر به صورت زیر است:

این کلاس فعلا کاربردی ندارد چون بدنه آن خالی است. حالا می‌خواهیم برای کلاس خود یک سری خصوصیات تعریف کنیم. در قسمت قبل با مفهوم خصوصیات و رفتارها آشنا شدید.

خصوصیات کلاس به صورت متغیرهایی در بدنه کلاس تعریف می‌شوند. به متغیرهایی که در بدنه کلاس تعریف می‌شوند فیلد (Field) هم گفته می‌شود. می‌خواهیم خصوصیات isStarted (وضعیت خاموش یا روشن بودن اتومبیل) و currentSpeed (سرعت فعلی اتومبیل) و fuel (مقدار سوخت موجود در اتومبیل) را در کلاس خود تعریف کنیم:

حالا یک کلاس ساده با سه فیلد داریم. همانطور که در قسمت مبانی شی‌گرایی گفتیم برای استفاده از یک کلاس باید یک شی (نمونه) از آن کلاس استفاده کنیم و یک کلاس به تنهایی قابل استفاده نیست. برای این کار به کلاس اصلی برنامه رفته و در متد main یک شی از کلاس Car ایجاد می‌کنیم.

تعریف اشیا

فرآیند تعریف یک شی در جاوا به دو قسمت تقسیم می‌شود:

  1. تعریف متغیری برای نگهداری آدرس شی در حافظه
  2. ایجاد شی در حافظه و نسبت‌دادن آن به متغیر تعریف‌شده

شکل کلی این فرآیند در زبان جاوا به صورت زیر است:

نام شی نام کلاس = new نام کلاس();

به شکل زیر دقت کنید:

joop3

عملگر new شی را در حافظه ایجاد کرده و آدرس آن در حافظه را بر می‌گرداند. سپس آدرس برگردانده‌شده درون متغیر myCar که از جنس Car است قرار می‌گیرد.

البته در بسیاری از مواقع لازم است که متغیر نگهدارنده را در محلی تعریف کرده و بعدا در محلی دیگر یک شی ایجاد کنیم و آدرس آن را در آن قرار دهیم. در این مواقع می‌توانیم به صورت زیر عمل کنیم:

بین این دو دستور می‌تواند کدهای دیگر باشد.

کار با مشخصه‌های یک شی

حال که یک شی از کلاس Car داریم می‌توانیم از مشخصه‌هایی که برای کلاس Car تعریف کردیم در این شی استفاده کنیم.

نام مشخصه.نام شی

مثال:

ابتدا شیئی از کلاس Car به نام myCar ایجاد کردیم.

به مشخصه‌های شی خود مقدار دادیم.

سپس در یک دستور شرطی بررسی کردیم که اتومبیل روشن است یا خاموش (با بررسی true بودن مشخصه isStarted که اگر true باشد شرط اول برقرار خواهد بود.)

اگر اتومبیل روشن بود آنگاه سرعت فعلی آن را چاپ می‌کنیم. همانطور که می‌بینید با استفاده از عملگر + مقدار یک متغیر را به یک متن پیوند زدیم.

اگر اتومبیل خاموش بود آنگاه پیغامی مبنی بر «اتومبیل هنوز روشن نشده است» چاپ خواهد شد.

اگر چند نمونه (شی) از یک کلاس داشته باشیم آنگاه هر نمونه مشخصه‌های خود را دارد و مقدار مشخصه‌های آن می‌تواند با نمونه‌های دیگر متفاوت باشد.

مثال:

متدها

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

شکل کلی تعریف یک متد به صورت زیر است:

نام متد‌ نوع داده بازگشتی متد() {

}

متدهای یک کلاس همان رفتارها هستند که درباره آن‌ توضیح دادیم. متد در واقع قطعه کدی است که کاری به‌خصوص را برای ما انجام می‌دهد.

هر متد باید نام اختصاصی خود را داشته باشد تا بتوان از آن استفاده کرد.

قوانین نام‌گذاری متدها هم مانند متغیرهاست. در نوشتن نام متد هم مانند نام متغیر از روش CamelCase استفاده می‌شود.

یک متد می‌تواند کاری را انجام دهد و مقداری را به عنوان نتیجه کار خود به ما برگرداند. البته الزاما متد مجبور نیست که مقداری را به عنوان نتیجه برگرداند و می‌تواند فقط کار خود را انجام دهد.

مثال: می‌خواهیم برای کلاس خود یک متد برای روشن‌کردن اتومبیل بنویسیم:

متدی که به کلاس Car اضافه کردیم ابتدا بررسی می‌کند که آیا اتومبیل خاموش است یا خیر. اگر خاموش بود اتومبیل را روشن کرده و پیغام «شما اتومبیل را روشن کردید» را چاپ می‌کند. اما اگر روشن بود آن‌گاه پیغام «اتومبیل قبلا روشن شده است» را چاپ خواهد کرد.

این متد مقداری را بر نمی‌گرداند بنابراین در قسمت نوع داده بازگشتی عبارت void (پوچ) را نوشتیم.

شکل کلی فراخوانی یک متد به صورت زیر است:

نام متد.نام شی();

حالا می‌خواهیم از این متد در اشیایی که از کلاس می‌سازیم استفاده کنیم:

وقتی برنامه به خط myCar.start() می‌رسد آن‌گاه ابتدا تمام خطوط متد start اجرا شده و سپس برنامه پایان می‌یابد (چون بعد از فراخوانی متد start دستور دیگری وجود ندارد.)

متد دیگری به نام getFuel اضافه می‌کنیم. کار این متد این است که مقدار سوخت فعلی را برمی‌گرداند (البته می‌توان مستقیما با دسترسی به مشخصه fuel مقدار سوخت را به دست آورد اما در قسمت بعد خواهید دید که به هیچ وجه نباید این کار را انجام داد!)

متد زیر را به کلاس اضافه کنید:

همانطور که می‌بینید نوع داده بازگشتی این متد int می‌باشد (چون مشخصه fuel از جنس int است و ما می‌خواهیم مقدار این مشخصه را برگردانیم) سپس با دستور return مقدار fuel را برمی‌گردانیم. حالا چون این متد یک مقدار از نوع int را بر می‌گرداند بنابراین می‌توانیم به صورت زیر مقدار آن را در یک متغیر قرار دهیم:

پس متد getFuel مقدار مشخصه fuel را به محلی که این متد از آن فراخوانی شده است بر می‌گرداند و مقدار آن در متغیری که تعریف کرده‌ایم قرار می‌گیرد. لازم به ذکر است که برای چاپ این مقدار می‌توانستیم مستقیما متد را در دستور println فراخوانی کنیم:

که در این صورت مقدار بازگشتی متد getFuel به متد println داده ‌می‌شود تا چاپ شود.

پارامترهای متد

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

به کلاس Car متدی برای افزایش میزان سوخت اضافه می‌کنیم. ابتدا یک مشخصه به نام fuelCapacity به کلاس اضافه می‌کنیم که بیانگر ظرفیت سوخت اتومبیل است:

حالا می‌خواهیم متدی بنویسیم که مقداری را به عنوان میزان سوخت دریافت کند و آن را به مشخصه fuel اضافه کند. این متد یک پارامتر به نام litres دارد که بیانگر میزان سوخت برحسب لیتر است و از جنس int می‌باشد:

چند نکته مهم راجع به این متد وجود دارد:

  1. به نحوه تعریف پارامتر برای متد دقت کنید: در پرانتز روبروی نام متد یک پارامتر تعریف کردیم که همانطور که می‌بینید نوع داده پارامتر و نام آن مشخص شده است. انتخاب نام برای پارامتر الزامیست چون برای استفاده از آن در متد باید از طریق نام آن به آن دسترسی داشته باشیم.
  2. این متد مقداری را برنمی‌گرداند (void) اما درون آن از دستور return استفاده کردیم. در متدهای void می‌توانیم با دستور return; از متد خارج شویم. این دستور مانند دستور break در حلقه‌های تکرار است.
  3. منطق این متد به این صورت است که اگر مقدار پارامتر کمتر از 1 بود از متد خارج می‌شود. اگر مقدار سوخت ورودی بیشتر از ظرفیت بود پیغام “شما نمی‌توانید بیشتر از ظرفیت سوخت اتومبیل به آن سوخت وارد کنید” چاپ می‌شود و سپس از متد خارج می‌شود. پس اگر هیچ کدام از دو شرط برقرار نبود و از متد خارج نشد آن‌گاه مقدار پارامتر را درون مشخصه fuel قرار می‌دهیم.

کد کلاس Car اکنون به شکل زیر است:

 

مصطفی نصیری

دانشجوی نرم افزار هستم و علاقه شدیدی به برنامه نویسی مخصوصا با زبان جاوا دارم! در حال حاضر تمرکزم روی اندرویده. دوست دارم چیزایی که یاد میگیرم رو با بقیه به اشتراک بگذارم :)

همچنین ممکن است دوست داشته باشید ...

۶ واکنش

  1. علی گفت:

    به نظرم اون یه تیکه هایی که فارسی هستن مثل :
    class نام کلاس {

    }
    رو برداری بهتره. زیاد خوانا نیست.
    به نظرم مثال کافیه
    حالا این نظر من بود البته …

  2. fatemeh گفت:

    سلام…اما به نظر من نوشتنشون به فارسی برای کسانی که تازه میخان جاوا رو یاد بگیرن لازمه….میشه لطفا آموزشا رو زود به زود رو سایت بزارید….ممنون

  3. امین گفت:

    خیلی عالی بود

  4. polpo گفت:

    خیلی خوب بود
    قابل فهم

  5. hojjat گفت:

    سلام . اموزش ها فوق العاده هستن. اگه امکانش هست فایل pdf هر اموزش رو در اخر اموزش قرار بدین خیلی خوب میشه . ممنون

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *