بررسی متدهایی با مقادیر برگشتی در زبان برنامه نویسی جاوا


در قسمت قبل با نحوه ی ارسال یک پارامتر به متد و تغییر آن در هر لحظه ای که تمایل داشتیم آشنا شدیم. در این قسمت قصد داریم تا مبحث return را مورد بررسی قرار دهیم. برای درک بهتر این موضوع بهتر است سناریویی که در قسمت پیشین در مورد رفتن به سوپر مارکت بیان کردیم را به خاطر آوریم. در واقع در آن سناریو زمانی که پدر یا مادرمان از ما درخواست کرد که به سوپر مارکت برویم و نان یا پنیر یا هر چیز دیگری بخریم هیچ گونه دستوری مبنی بر این که پس از خرید نان بلافاصله آن را به خانه بیاور وجود نداشت. در زبان برنامه نویسی جاوا در مورد متدها این دستور از طریق کلید واژه return انجام می شود.

سناریویی که در این قسمت از آموزش قصد داریم مطرح کنیم به این صورت است که فرض کنیم که ما برای برنامه نویسی از یک PC استفاده می کنیم و از آنجا که قصد داریم پروژه های خود را به موقع به پایان برسانیم نیاز به خرید یک لپ تاپ داریم تا همواره همراه ما باشد که بتوانیم حتی در زمان هایی هم که در منزل نیستیم روی پروژه خود کار کنیم. نکته ای که در اینجا وجود دارد این است که نمی دانیم کدام مدل لپ تاپ برای برای کار ما مناسب است که از قبل هزینه آن را تهیه کرده و همراه خود به خرید ببریم. برای این منظور به مرکز خرید کامپیوتر رفته و جستجوی خود را آغاز می کنیم.

به منظور درک بهتر این موضوع، پروژه ای جدید تحت عنوان Buying A Laptop به معنی "خرید یک لپ تاپ" ایجاد کرده و کلاسی به اسم MainClass به معنی "کلاس اصلی" در آن می سازیم. حال کلاس اصلی خود را به شکل زیر آغاز تکمیل می کنیم:

public class MainClass {
    public int goToComputerComplex() {
        int laptopPrice = 0;
        return laptopPrice;
    }
}

در کد فوق یک متد از جنس int تحت عنوان goToComputerComplex به معنی "برو به مجتمع کامپیوتری" ایجاد کرده و متغیری از جنس int به نام laptopPrice به معنی "قیمت لپ تاپ" ایجاد کرده و مقدار اولیه آن را معادل با صفر قرار می دهیم.

پیش از نام متد کلید واژه public دیده می شود که همانطور که قبلاً هم گفته شد به این معنا است که این متد از هر جای برنامه قابل دسترسی خواهد بود. هدف از ایجاد متغیر laptopPrice این است که هزینه خرید لپ تاپ به آن اختصاص داده شود و از سوی دیگر این متغیر یک Local Variable است و این بدان معنا است که این متغیر از هر جای دیگری خارج از متدی که داخل آن قرار گرفته است غیر قابل دسترسی خواهد بود.

به طور کلی هر زمانی که بخواهیم متد ما داده ای را بازگرداند یا اصطلاحاً return کند، نیاز است تا نوع متغیری که می خواهیم مقدار آن return شود را پیش از نام متد خود بنویسیم. به طور مثال اگر بخواهیم که متد ما یک عدد اعشاری را return کند پس بایستی کلیدواژه ی double را نوشته و یا اگر بخواهیم مقدار بازگشتی متد ما یک داده از جنس true یا false باشد پس می بایست پیش از نام متد کلیدواژه ی boolean را بنویسیم. در این مثال از آنجا که می خواهیم داده ای از جنس int بازگردانده شود، پس کلید واژه int را قبل از نام متد خود می نویسیم (در حقیقت نام متغیر به جای کلید واژه void قرار خواهد گرفت.)

اکنون نیاز داریم تا متد خود را از داخل کلاس دیگری فرا بخوانیم. برای همین منظور یک کلاس جدید تحت عنوان ActionClass به معنی "کلاس عملیاتی" ایجاد کرده و از آنجا که می خواهیم این کلاس به منزله نقطه شروع برنامه باشد، در حین ساخت آن گزینه public static void main را تیک می زنیم. حال کد کلاس ما می بایست به شکل زیر باشد:

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

هم اکنون نیاز است تا یک آبجکت از روی کلاس MainClass داخل کلاس ActionClass ایجاد کنیم. برای این منظور کد خود را به شکل زیر تکمیل می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        MainClass myObject = new MainClass();
    }
}

همان طور که قبلاً آموزش داده شد، یک آبجکت جدید تحت عنوان myObject به معنی "شیء من" از روی کلاس MainClass ایجاد می کنیم. با این کار به متد ساخته شده در کلاس MainClass هم دسترسی خواهیم داشت. همانطور که قبلا گفته شد، متد goToComputerComplex داده ای را return خواهد کرد که جنس آن داده int است. از این رو یک متغیر جدید در کلاس ActionClass تحت عنوان totalPrice به معنی "قیمت کل" ایجاد کرده و مقدار آن را برابر با متد goToComputerComplex قرار می دهیم:

public class ActionClass {
    public static void main(String[] args) {
        MainClass myObject = new MainClass();
        int totalPrice = myObject.goToComputerComplex();
    }
}

به طور خلاصه، هر مقداری که برای متغیر laptopPrice در متد goToComputerComplex واقع در کلاس MainClass در نظر گرفته شود، به متغیر totalPrice که در کلاس ActionClass قرار دارد return یا «بازگردانده» خواهد شد. اکنون برای آن که بتوانیم مقدار return شده را روی صفحه کنسول مشاهده کنیم، نیاز است تا از دستور ;()System.out.println استفاده کنیم. بنابراین کد ما به شکل زیر در خواهد آمد:

public class ActionClass {
    public static void main(String[] args) {
        MainClass myObject = new MainClass();
        int totalPrice = myObject.goToComputerComplex();
        System.out.println("The price of my laptop is: " + totalPrice);
    }
}

همان طور که در کد فوق مشاهده می شود، دستور ;()System.out.println را نوشته و چیزی که می خواهیم روی صفحه کنسول به نمایش در آید را داخل پرانتز آن قرار می دهیم. از آنجا که در این مثال می خواهیم مقدار متغیر totalPrice که به عبارتی همان مقدار return شده متغیر laptopPrice است را نمایش دهیم، پس نام totalPrice را داخل پرانتز می نویسیم. با توجه به این که می خواهیم بدانیم که این مقدار نمایش داده شده متعلق به چیست، پیش از نام این متغیر عبارت :The price of my laptop is به معنی "قیمت لپ تاپ من معادل است با:" را که یک استرینگ است به آن اضافه می کنیم. پس از اجرای برنامه خروجی زیر مشاهده خواهد شد:

همان طور که در تصویر فوق مشاهده می شود برنامه به درستی کار کرده و مقدار return شده که هم اکنون معادل با صفر است را در کلاس ActionClass نمایش می دهد. حال مقدار return شونده را در کلاس MainClass را به عدد 2800000 تغییر می دهیم:

public class MainClass {
    public int goToComputerComplex() {
        int laptopPrice = 2800000;
        return laptopPrice;
    }
}

مجدد برنامه را اجرا می کنیم:

همان طور که ملاحظه می شود، به محض تغییر مقدار متغیر، مقدار return شونده از سوی متد goToComputerComplex نیز تغییر پیدا می کند. اکنون که قیمت لپ تاپ نهایی شد، اگر خود سر کار می رویم که می بایست به حساب بانکی مان رجوع کنیم و در غیر این صورت این مقدار return شده را به شماره همراه یکی از والدین خود مجدد return می کنیم تا این مبلغ را برای ما واریز کنند!

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
درود بر شما!
کاربر میهمان
کاربر میهمان
ادمین سایت
ادمین سایت
سلام
ممنون از اطلاع رسانی شما
این قضیه به مسئول مربوطه ارجاع شد.


با تشکر
ارادتمند
تیم سکان آکادمی

در پاسخ به

ApA
ApA
باسلام و تشکر از پشتیبانی و مطالب عالیتان
من این قسمت رو هم کامل خوندم ولی متوجه نشدم دقیقا دستور return به چه دردی می خورد؟
ممنون میشم پاسخم را بدهید
نرگس اسدی
نرگس اسدی
سلام
دوست عزیز اصولا یک تقسیم بندی برای متدها بر اساس وظیفه ی آن ها وجود داره.
ما از یک سری متدها انتظار داریم که فقط یک سری دستورات را اجرا کنند. مثلا چند خط متن را در برنامه چاپ کنند. این نوع از متدها خروجی خاصی ندارند.
در مقابل متدهای دیگری هستند که باز هم یک سری دستورات رو انجام می دهند اما در نهایت حاصل کار آن ها یک شیء است. یعنی برنامه انتظار داره هر جا این نوع متدها رو صدا زد یک شیء تحویل بگیره. در این جا برنامه کاری نداره که متد چطور این شیء را تولید کرده و این به متد ارتباط پیدا می کنه که چطور شیء را ایجاد کنه،تنها چیزی که اهمیت داره این است که این شیء ساخته بشه و تحویل برنامه داده بشه تا از آن استفاده کنه. شیء ایجاد شده در نهایت با دستور returnتحویل داده میشه. مثلا فرض کنید متدی داریم که یک کلمه می گیره و تعداد حروف آن را محاسبه می کنه و در متغیر count ذخیره کنه. اگر از دستور ریترن استفاده نکنیم در زمان فراخوانی این متد فقط محاسبه را انجام میده و نتیجه را در متغیر ذخیره می کنه. اما فرض کنیم که برنامه بخواهد از این متغیر استفاده کنه و مثلا حاصل آن را با عدد 3جمع بزنه. در این صورت در بدنه ی متد باید از دستور ریترن طوری استفاده کنیم که مقدار متغیر countرا به برنامه تحویل بده.
تفوت این دو حالت دقیقا مثل این هست که در حالت اول از شما بخوان یک کتاب بخونید و تا حاصل این مطالعه باعث بشه ذهن شما باز بشه و بتونید کتاب بنویسید و در حالت دوم از شما درخواست بشه بعد از مطالعه ی کتاب خلاصه ای از آن تهیه کنید تا در کتاب یا مجله یا وبلاگی (به عبارت دیگر هر جایی که از شما درخواست شد)چاپ بشه.

در پاسخ به

ApA
ApA
خیلی ممنون,به طور کامل متوجه شدم.

در پاسخ به

کاربر میهمان
کاربر میهمان
باسلام وتشکر مجدد
از اینکه جواب سوالم رو دادید متشکرم
ولی سوالی که برام پیش اومده اینه چرا از متغییر هایی غیر از void استفاده میشه که مجبور به استفاده از return باشیم
البته این نشون میده که من مفهوم return رو متوجه نشدم برای همین ازتون میخوام یه توضیح کوچیک ومفید بهم بدید که در واقعه کارایی return چه جاهایی میتونه باشه
یاز هم متشکر
نامشخص
نامشخص
با سلام
دوست عزیز، یک برنامه نویس خوب کارهای بزرگ را به کارهای کوچکتری تقسیم می کند. این کارهای کوچک به شکل یک متد (تابع) از یک کلاس هستند. خوب، فکر کنید قرار است کاری مرحله به مرحله جلو برود. اگر هر مرحله باید مقداری را به مرحله بعدی بدهد تا کار ادامه بیابد، اینجاست که return یک مفهوم مهم تلقی می شود. اگر قرار باشد که از void استفاده کنیم هیچ مقداری از متد نخواهیم داشت.

در پاسخ به

کاربر میهمان
کاربر میهمان
با سلام وتشکر از آموزش خوبتون
میخواستم بگم من دلیل استفاده از return را در اینجا متوجه نمیشم چون با توجه به آموزش قبل اگه ما توی ساختن متد به جای public int از public void استفاده کنیم و از return هم استفاده نکنیم باز هم دستور بدون مشکل اجرا میشه
CIna Deuxshiri
CIna Deuxshiri
سلام
دقیقا شما درست متوجه شدین. متد با مقداره برگشتیش از نوع void هست و یا void نیست چیزه دیگه ایه. اگه چیزه دیگه ای باشه باید با استفاده از دستور return اون مقدار و برگردونیم. البته به جز کانستراکتور که بحثش فرق می کنه.

در پاسخ به