در آموزش نحوۀ تعریف متد در زبان برنامهنویسی جاوا، با چگونگی تعریف یک متد آشنا شدیم و در این آموزش قصد داریم تا به بررسی نحوۀ تعریف پارامتر ورودی برای متدها در زبان برنامهنویسی جاوا پرداخته و ببینیم که چگونه میتوان دادهای را به عنوان آرگومان ورودی به متد مورد نظر پاس داده و آن را فراخوانی کرد.
پیش از شروع آموزش، یک پروژۀ جدید تحت عنوان PassingDataToMethods در محیط برنامهنویسی اکلیپس ایجاد کرده و کلاسی به نام MainClass
در آن میسازیم. حال برای روشن شدن مطالب ارائهشده در این آموزش سناریویی را در نظر میگیریم که در آن فرض میکنیم والدین یا همسرمان از ما میخواهند تا به سوپرمارکت رفته و اقلام مورد نیاز خود را خریداری کنیم. به عبارتی، باید به سوپرمارکت رفته و کاری را انجام دهیم که در چنین شرایطی میتوانیم این کار را به عنوان تَسکی داخل یک متد تعریف کرده و آن را پیادهسازی نماییم. به علاوه، میتوانیم اقلام مورد نیاز برای خرید را به منزلۀ آرگومانی در نظر بگیریم که باید به متد مورد نظر پاس داده شده و کار خرید روی آنها انجام شود.
با توجه به آنچه در بالا بدان اشاره کردیم، متدی تحت عنوان ()goToSuperMarket
را در نظر گرفته و در ادامه دستوراتی مبنی بر چاپ استرینگ مربوط به نام آیتمهای مورد نیاز را داخل آن پیادهسازی مینماییم که برای این منظور میتوانیم هر یک از آیتمهای مد نظر برای خرید همچون «نان» و «پنیر» را به عنوان آرگومان ورودی به متد مذکور پاس دهیم تا عمل خریدن روی آنها انجام شود.
در چنین شرایطی، اگر بخواهیم متد فوق را به منظور انجام کار روی آیتم «نان» فراخوانی کنیم، میباید از دستوری به صورت ;("goToSuperMarket("bread
استفاده کنیم (توجه داشته باشیم که نام ورودی در قالب دیتایی از جنس استرینگ بوده و مابین علائم " "
به آن پاس داده میشود.) در واقع، آیتم نان به عنوان آرگومانی است که در لحظه به متد ()goToSuperMarket
اضافه شده است. اکنون اگر تصمیم خود را عوض کرده و بخواهیم موردی همچون «پنیر» را از سوپرمارکت خریداری نماییم، میتوانیم آیتم مورد نظر را به عنوان آرگومان ورودی در نظر گرفته و این بار استرینگی مانند «cheese» را با استفاده از دستور ;("goToSuperMarket("cheese
به متد مورد نظر پاس دهیم. به علاوه، در صورت تمایل به خرید هر دو مورد هم میتوانیم متد ()goToSuperMarket
را به صورت ;("goToSuperMarket("bread", "cheese
فراخوانی نماییم.
نکته |
نوع و همچنین تعداد پارامترهای ورودیِ تعریفشده برای متد بسیار مهم بوده و به ترتیب، تعیینکنندۀ دیتا تایپ مربوط به آرگومان ورودی و تعداد آنها در هنگام فراخوانی متد مذکور میباشند. به عبارت دیگر، در هنگام فراخوانی یک متد، دیتا تایپ و تعداد آرگومانهای ورودی به آن میباید دقیقاً مشابه با دیتا تایپ مورد استفاده در تعریف پارامترهای ورودی و همچنین تعداد آنها باشند. |
به طور کلی، اضافه کردن یک پارامتر یا لیستی از پارامترها به یک متد منجر به افزایش کارایی متد مذکور میشود به طوری که مثلاً به جای آنکه متد مورد نظر در هر بار اجرا یکسری دستور را روی دیتایی از پیش تعریفشده اجرا کرده و خروجی مشابهی داشته باشد، میتوان در صورت نیاز دیتای متفاوتی را به آن داده و دستورات تعریفشده برای متد مربوطه را روی آرگومان یا آرگومانهای مورد نظر اجرا کرد.
برای مثال، در رابطه با سناریوی مطرحشده در این آموزش نیز میتوان گفت که تعریف پارامتر ورودی برای متد ()goToSuperMarket
به منزلۀ افزودن قابلیتی جهت خرید تعداد اقلام دلخواه از سوپرمارکت میباشد به طوری که میتوانیم یک بار برای خرید نان، بار دیگر برای خرید پنیر یا حتی خرید بستنی به سوپر مارکت برویم!
در این مرحله از آموزش و به منظور روشنتر شدن توضیحات فوق، در ادامه این مفاهیم را در قالب سناریوی فوقالذکر پیادهسازی میکنیم و برای این منظور کلاسی که در ابتدای این آموزش ایجاد کردیم را به شکل زیر تکمیل میکنیم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket() {
System.out.println(mySentence);
}
}
در کد فوق، آبجکتی از روی کلاس String
تحت عنوان mySentence
تعریف کرده و استرینگ « Dear son go to supermarket and also buy some» را بدان منتسب کردهایم سپس متدی با سطح دسترسیِ public
تحت عنوان ()goToSuperMarket
ساختهایم که این متد قرار نیست دیتایی را در خروجی ریترن کند و از همین روی آن را از جنس void
تعریف کردهایم. به عبارت دیگر، متد ()goToSuperMarket
صرفاً این وظیفه را دارا است تا استرینگ منتسب به آبجکت mySentence
مبنی بر «درخواست برای خرید چیزی» را روی صفحۀ کنسول چاپ کرده و در ادامه نام آیتم مورد نیاز برای خرید را به همراه استرینگ مذکور در کنسول چاپ نماید.
اکنون با استفاده از کلاس String
آبجکتی تحت عنوان something
تعریف کرده و آن را به عنوان پارامتر ورودی برای متد خود در نظر میگیریم تا بدین وسیله بتوانیم استرینگ مربوط به نام آیتم مورد نظر خود را به آن پاس دهیم که برای این منظور کد فوق را به صورت زیر بازنویسی مینماییم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket(String something) {
System.out.println(mySentence);
}
}
همانطور که مشاهده میکنیم، داخل پرانتز مقابل نام متد یک آبجکت از جنس کلاس String
تحت عنوان something
تعریف کردهایم و همانطور که پیشتر اشاره کردیم این متد وظیفه دارد تا در صورت فراخوانی، استرینگ مربوط درخواست برای خرید چیزی را به همراه استرینگ مربوط به نام آیتم مد نظر گرفته و آنها را با یکدیگر کانکت کرده سپس روی صفحۀ کنسول چاپ میکند. حال دستورات داخلی این متد مبنی بر نمایش استرینگ مربوط به دستور خرید چیزی به همراه آرگومان ورودی را به صورت زیر در برنامۀ خود اضافه مینماییم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket(String something) {
System.out.println(mySentence + something);
}
}
در این مرحله، در صورت فراخوانی متد فوق میباید استرینگی را به عنوان آرگومان ورودی بدان پاس دهیم که بدین ترتیب استرینگ ورودی به آبجکت something
منتسب شده و به همراه استرینگ اختصاصیافته به آبجکت mySentence
در کنسول چاپ میشوند که در همین راستا جهت فراخوانی متد ()goToSuperMarket
یک کلاس دیگر تحت عنوان ActionClass
داخل پروژۀ PassingDataToMethods ایجاد کرده و آن را به عنوان نقطۀ شروع برنامۀ خود قرار میدهیم و از همین روی در حین ساخت کلاس هم تیک گزینۀ public static void main را میزنیم تا جایی که کد مربوط به فایل ActionClass
در ابتدا به صورت زیر خواهد بود:
public class ActionClass {
public static void main(String[] args) {
}
}
اکنون در متد ()main
داخل کلاس ActionClass
آبجکتی از روی کلاس MainClass
به روش زیر میسازیم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
}
}
در کد فوق، مشابه آنچه که در آموزش مقدمهای بر مفهوم شیئگرایی در زبان برنامهنویسی جاوا بیان کردیم، برای ساخت آبجکت از روی کلاس MainClass
بدین صورت عمل میکنیم که ابتدا نام کلاس را نوشته و در ادامه نام myShopping
را برای آبجکت مورد نظر انتخاب میکنیم سپس با استفاده از کیورد new
و مجدداً ذکر نام کلاس به کامپایلر جاوا دستور میدهیم که آبجکتی جدید از روی کلاس MainClass
ساخته و آن را با استفاده از عملگر =
به myShopping
منتسب نماید. در این مرحله میتوانیم روی آبجکت جدید ساختهشده از روی کلاس MainClass
متد مد نظر خود را در کلاس مذکور فراخوانی نماییم و برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket();
}
}
همانطور که مشاهده میکنیم، برای فراخوانی متد ()goToSuperMarket
ابتدا نام آبجکت جدید ساختهشده را نوشته سپس یک .
قرار داده و در ادامه نام متد تعریفشده در کلاس مربوطه را مینویسیم و در پایان دستور نیز یک علامت ;
قرار میدهیم. در این مرحله به محض سِیو کردن برنامۀ فوق، محیط برنامهنویسی اکلیپس با قرار دادن نقطهچین دور نام متد خطایی را در قالب عبارت زیر در معرض دید ما قرار میدهد:
The method goToSuperMarket(String) in the type MainClass is not applicable for the arguments ()
در واقع، ارور فوق از آنجایی ناشی میشود که متد ()goToSuperMarket
را با یک پارامتر ورودی از جنس کلاس String
تعریف کرده اما آن را بدون هیچ آرگومانی فراخوانی نمودهایم که آیدیای اکلیپس نیز به منظور رفع مشکل به وجود آمده پیشنهاد پاس دادن مقداری از جنس کلاس String
را به عنوان آرگومان ورودی به این متد ارائه میکند. بنابراین به منظور فرخوانی متد ()goToSuperMarket
نیاز است تا استرینگ مربوط به نام آیتم مد نظر را به عنوان ورودی و داخل علائم " "
بدان پاس دهیم که برای این منظور کد فوق را به صورت زیر تکمیل مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket("bread");
}
}
همانطور که مشاهده میکنیم، استرینگ «bread» را به عنوان آرگومان ورودی به متد ()goToSuperMarket
پاس دادهایم که با اجرای برنامۀ فوق استرینگ مذکور با استرینگ منتسب به آبجکت mySentence
کانکت شده و در کنسول چاپ میگردد به طوری که در خروجی خواهیم داشت:
Dear son go to supermarket and also buy some bread
حال اگر بخواهیم مثلاً آیتم دیگری همچون «پنیر» را خریدار نماییم، میتوانیم استرینگ مربوط به نام آن را به جای استرینگ قبلی به متد ()goToSuperMarket
پاس دهیم تا دستورات تعریفشده برای این متد روی آرگومان ورودی جدید نیز اِعمال گردند به طوری که به روش زیر استرینگ «cheese» را به عنوان آرگومان ورودی به متد مذکور پاس داده و آن را فراخوانی مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket("cheese");
}
}
مشابه آنچه در مثال پیشین توضیح دادیم، استرینگ «cheese» به آبجکت something
منتسب شده و به همراه استرینگ اختصاصیافته به آبجکت mySentence
در کنسول چاپ میگردد به طوری که با اجرای برنامۀ فوق در خروجی خواهیم داشت:
Dear son go to supermarket and also buy some cheese
همانطور که میبینیم، با تعریف پارامتر ورودی برای متد ()goToSuperMarket
توانستیم تا به صورت اصطلاحاً Real-time ورودی مورد نظر خود را به متد مربوطه پاس داده و بدین ترتیب دستورات تعریفشده برای متد مذکور روی دیتای ورودی اجرا شده و خروجی متناسب با دیتای دریافتشده را به دست آوردیم.