اضافه کردن پارامتر به متدها در جاوا
به هنگام فراخوانی برخی از متدها، لازم است که داده هایی را به آن متد ارسال کنیم. به داده هایی که به هنگام فراخوانی یک متد، آنها را مورد استفاده قرار می دهیم(و به متد ارسال می کنیم) آرگومان گفته می شود. اما هنگامی که متد مورد نظر، داده ها را دریافت می کند، به این داده ها پارامتر گفته می شود. متدهایی که به آنها داده ارسال می شود، قادر هستند تا بر اساس داده های دریافتی، خروجی های متفاوتی را تولید کنند.
یکی از اصول مهم در برنامه نویسی شیء گرا، مفهوم پنهان سازی جزئیات(implementation hiding) است. پنهان سازی جزئیات، به معنای کپسوله سازی جزئیات یک متد، در داخل یک کلاس، می باشد. بنابراین هنگامی که کاربر یک متد را فراخوانی می کند، دیگر نیازی ندارد تا با جزئیات اجرا شدن این متد، آشنا شود.
نوشتن یک متد که پارامتر دریافت می کند، درست مثل نوشتن یک متد است که هیچ پارامتری را دریافت نمی کند(که قبلا توضیح داده شد). اما شما باید موارد زیر را در داخل پرانتزهای آن متد، اضافه نمایید:
- نوع آن پارامتر
- یک نام محلی برای آن پارامتر
بعنوان مثال، یک متد public به نام ()predictRaise که حقوق یک کارمند را با 10% افزایش نشان می دهد، می تواند به صورت زیر نوشته شود:
مثال(اضافه کردن پارامتر به متدها در جاوا)
public static void predictRaise(double moneyAmount)
یک پارامتر دریافت شده توسط یک متد، می تواند از هر نوعی باشد. مثلا می تواند از نوع int یا double یا char باشد. و حتی می تواند یک کلاس باشد.
اگر به مثال بالا توجه کنید، پارامتر double moneyAmount که در بین پرانتزها قرار دارد، نشان می دهد که متد ()predictRaise یک مقدار از نوع double را دریافت می کند و به وسیله ی نام moneyAmount می توانیم این مقدار را مورد استفاده قرار دهیم. عکس 3.6 این متد را به طور کامل نشان می دهد.
( شماره 1: نوع پارامتر؛ شماره 2: یک پارامتر محلی؛)
متد ()predictRaise یک متد از نوع خروجی void است زیرا هیچ مقداری را برنمی گرداند(return نمی کند). تنها عملکرد این متد این است که مقدار moneyAmount را دریافت می کند و آن را در ثابت RAISE ضرب می کند و سپس حاصل را نشان می دهد. در کل، به متدی که چیزی را return نکند، یک متد از نوع برگشتی void گفته می شود.
برای فراخوانی متد ()predictRaise، می توانید یک مقدار ثابت یا یک متغیر را بعنوان آرگومان، به آن بدهید. بنابراین دستور (predictRaise(472.25 و دستور (predictRaise(mySalary هردو صحیح هستند.
فرض کنید که متغیر mySalary از نوع double باشد و یک مقدار مناسب به آن انتساب داده شده باشد. حال شما قادر هستید تا متد ()predictRaise را با استفاده از مقادیر متفاوت، به هر تعداد دلخواه، اجرا کنید. حالا در داخل این متد، هر یک از این آرگومان ها را می توانید با استفاده از متغیر moneyAmount مورد استفاده قرار دهید. هر مقدار از نوع double، که به متد ()predictRaise داده شود،کپی می شود و در داخل متغیر moneyAmount قرار می گیرد.
جالب است بدانید که اگر آرگومان داده شده به متد ()predictRaise یک متغیر باشد، در هر بار فراخوانی، مقدار آن در داخل همان پارامتر قرار می گیرد؛ بعنوان مثال، آن مقدار همواره در داخل moneyAmount یا mySalary قرار می گیرد. بعنوان مثال در کدهای عکس 3.7 سه بار متد ()predictRaise فراخوانی شده است و خروجی آن در عکس 3.8 نشان داده شده است. همان طور که مشاهده می کنید، در یکی از این فراخوانی ها، از مقدار ثابت 400.00 استفاده شده است و در دو مورد دیگر، از متغیرها استفاده شده است. به طوری که در یکی از آنها نام متغیر برابر با moneyAmount است و در دیگری، نام متغیر برابر با mySalary است.
پارامتر moneyAmount که در داخل متد ()predictRaise تعریف شده است، درواقع یک متغیر دربردارنده (جا نگهدار) است و مقادیر بیرونی، در داخل آن قرار می گیرند. پارامتر moneyAmount در داخل متد ()predictRaise یک متغیر محلی است. همچنین در داخل متد مذکور، یک ثابت و یک متغیر نیز قرار دارند که هردو محلی هستند.
نکته: کلمه ی final باعث می شود که RAISE یک ثابت(constant) در نظر گرفته شود.
نکته: به ابهام(بی دقتی) ایجاد شده در عکس 3.8 توجه کنید. همان طور که در فصل 2 آموختید، انجام محاسبات بر روی اعداد ممیز شناور می تواند باعث ایجاد ابهام(بی دقتی) شود. در صورتی که نمی خواهید اعداد شما همچون خروجی بالا باشند، می توانید از تکنیک ارائه شده در ضمیمه ی C استفاده کنید تا در خروجی اعدادی با رقم های اعشاری دلخواه داشته باشید.
هر زمان که متد ()predictRaise که در عکس 3.7 قرار دارد، اجرا می شود، متغیر moneyAmount (در داخل آن)دوباره تعریف می شود و آماده ی دریافت مقدار جدید می شود. سپس در داخل این متغیر(moneyAmount) که در داخل متد ()predictRaise قرار دارد، یک کپی از مقداری که به این متد پاس داده شده است، قرار می گیرد. هنگامی که متد ()predictRaise با استفاده از آکولاد بسته، پایان می پذیرد، متغیر محلی moneyAmount نابود می شود. و با پایان یافتن این متد، بخشی از حافظه که توسط متغیر moneyAmount اشغال شده بود، آزاد می شود.
اما اکنون به متغیر moneyAmount که در داخل متد ()main قرار دارد نگاه کنید. با اینکه این متغیر نسبت به متغیر moneyAmount که به صورت محلی در داخل متد ()predictRaise تعریف شده بود، نام یکسانی دارد، اما با آن متفاوت است و در مکان دیگری از حافظه جای دارد.
آموزش ایجاد متدهایی که به چند پارامتر نیاز دارند
این امکان وجود دارد که یک متد، بیش از یک پارامتر را بپذیرد. شما می توانید به هنگام فراخوانی یک متد، با جدا کردن آرگومان ها به وسیله ی کاما،چندین آرگومان را به یک متد بدهید. بعنوان مثال، به جای اینکه یک متد به نام ()predictRaise ایجاد کنیم که به حقوق افراد مقدار 10% را اضافه کند، می توانیم یک متد ایجاد کنیم که بتوان به آن دو مقدار داد: مقدار حقوق و درصد افزایش آن حقوق. عکس 3.9 یک متد را نشان می دهد که از دو پارامتر استفاده می کند:
در عکس 3.9 دو پارامتر به نام های double money و double rate در بین پرانتزها قرار گرفته اند. علامت های کاما، باعث می شوند که پارامترها از یکدیگر جدا شوند.
نکته: هنگام تعریف پارامتر در بین پرانتزهای متد، باید نوع هر پارامتر را تعیین کنید، حتی اگر این پارامترها نوع یکسانی داشته باشند.
به مثال زیر توجه کنید. هنگامی که مقادیری به صورت زیر به متد تصویر بالا ارسال شوند، اولین مقدار ارسال شده، در داخل متغیر محلی money قرار می گیرد و دومین مقدار ارسال شده در داخل متغیر محلی rate قرار می گیرد:
مثال(اضافه کردن پارامتر به متدها در جاوا)
predictRaiseUsingRate(mySalary, promisedRate);
بنابراین در هنگام ارسال آرگومان ها به یک متد، باید به ترتیب قرار گیری آنها توجه کنیم.
در صورتی که پارامترهای دو متد، دارای نوع یکسانی باشند(بعنوان مثال هردو از نوع double باشند)، و ما ترتیب مقداردهی به آنها را رعایت نکنیم، باعث ایجاد یک خطای منطقی خواهد شد. این یعنی برنامه ی ما کامپایل و اجرا خواهد شد اما نتایج اشتباهی را ایجاد خواهد نمود. و در صورتی که پارامترهای یک متد دارای نوع های متفاوتی باشند، و ما آرگومان ها را جابه جا به آن بدهیم، باعث ایجاد یک خطای نحوی(syntax error) خواهد شد و برنامه ی ما کامپایل نخواهد شد.
پاراگراف آخر ص113 به بعد ادامه یابد.
- نوشته شده توسط احسان عباسی
- بازدید: 5126