اعلامیهٔ یک Method یا Constructor، تعداد و نوع آرگومانها را مشخص میکند. برای مثال، کد زیر یک Method است که پرداخت ماهانهٔ وام مسکن را بر اساس مبلغ وام، نرخ بهره، مدت زمان وام (تعداد دورهها) و ارزش آیندهٔ وام محاسبه میکند:
public double computePayment(
double loanAmt,
double rate,
double futureValue,
int numPeriods) {
double interest = rate / 100.0;
double partial1 = Math.pow((1 + interest),
- numPeriods);
double denominator = (1 - partial1) / interest;
double answer = (-loanAmt / denominator)
- ((futureValue * partial1) / denominator);
return answer;
}
این Method چهار پارامتر (Parameter) دارد: مبلغ وام، نرخ بهره، ارزش آینده و تعداد دورهها. سه مورد اول از نوع عدد اعشاری با دقت مضاعف (double) و چهارمی از نوع عدد صحیح (int) است. پارامترها در بدنهٔ Method استفاده میشوند و در زمان اجرا مقدار آرگومانهای ورودی را به خود میگیرند.
تفاوت Parameter و Argument: Parameter به متغیرهای لیستشده در اعلامیهٔ Method اشاره دارد. Argument مقدارهای واقعی است که هنگام فراخوانی Method ارسال میشوند. هنگام فراخوانی Method، آرگومانهای ارسالی باید از نظر نوع و ترتیب با پارامترهای اعلامیه مطابقت داشته باشند.---
برای پارامترهای Method یا Constructor میتوانید از هر نوع دادهای استفاده کنید. این شامل انواع اولیه (Primitive Types) مثل double، float و int و همچنین انواع ارجاعی (Reference Types) مثل اشیا و آرایهها میشود.
مثال زیر Methodای را نشان میدهد که یک آرایه بهعنوان آرگومان دریافت میکند. در این مثال، Method یک شیء Polygon جدید میسازد و آن را از یک آرایه از اشیای Point مقداردهی اولیه میکند:
public Polygon polygonFrom(Point[] corners) {
// بدنهٔ Method اینجا قرار میگیرد
}
---
میتوانید از ساختاری به نام Varargs برای ارسال تعداد نامحدود مقدار به یک Method استفاده کنید. این زمانی مفید است که نمیدانید دقیقاً چند آرگومان از یک نوع خاص ارسال خواهد شد. Varargs در واقع یک میانبر برای ساخت دستی آرایه است.
برای استفاده از Varargs، پس از نوع آخرین پارامتر سه نقطه (...) میگذارید، سپس یک فاصله و نام پارامتر را مینویسید. با این کار، Method با هر تعداد از آن پارامتر قابل فراخوانی است — حتی بدون هیچ آرگومانی.
public Polygon polygonFrom(Point... corners) {
int numberOfSides = corners.length;
double squareOfSide1, lengthOfSide1;
squareOfSide1 = (corners[1].x - corners[0].x)
* (corners[1].x - corners[0].x)
+ (corners[1].y - corners[0].y)
* (corners[1].y - corners[0].y);
lengthOfSide1 = Math.sqrt(squareOfSide1);
// کد بیشتری برای ایجاد و برگرداندن
// چندضلعی متصلکنندهٔ نقاط وجود دارد
}
همانطور که میبینید، در داخل Method، corners دقیقاً مثل یک آرایه رفتار میشود. Method میتواند هم با یک آرایه و هم با یک رشته از آرگومانها فراخوانی شود.
Varargs بیشتر در Methodهای چاپی دیده میشود. مثلاً این اعلامیهٔ printf():
public PrintStream printf(String format, Object... args)
به شما اجازه میدهد تعداد نامحدودی شیء چاپ کنید. نحوهٔ فراخوانی آن به این شکل است:
System.out.printf("%s: %d, %s%n", name, idnum, address);
یا با تعداد متفاوتی آرگومان:
System.out.printf("%s: %d, %s, %s, %s%n", name, idnum, address, phone, email);
---
هنگام تعریف پارامتر در Method یا Constructor، باید یک نام برای آن در نظر بگیرید. این نام در داخل بدنهٔ Method برای ارجاع به مقدار ورودی استفاده میشود.
نام پارامتر باید در دامنهٔ (Scope) خود منحصربهفرد باشد. نمیتواند با نام پارامتر دیگری در همان Method یا Constructor یکسان باشد، و نمیتواند نام یک متغیر محلی (Local Variable) در همان Method یا Constructor باشد.
یک پارامتر میتواند نامی مشابه با یکی از فیلدهای کلاس داشته باشد. در این حالت، پارامتر فیلد را سایهپوشانی (Shadow) میکند. این کار خوانایی کد را کاهش میدهد و معمولاً فقط داخل Constructorها و Methodهایی استفاده میشود که یک فیلد خاص را تنظیم میکنند. برای مثال:
public class Circle {
private int x, y, radius;
public void setOrigin(int x, int y) {
...
}
}
کلاس Circle سه فیلد دارد: x، y و radius. Method setOrigin() دو پارامتر دارد که هرکدام نامی مشابه یکی از فیلدها دارند. استفاده از نامهای ساده مثل x یا y در داخل Method به پارامتر ارجاع میدهد، نه به فیلد. برای دسترسی به فیلد باید از نام واجد (Qualified Name) استفاده کنید. این موضوع در بخش «استفاده از کلمهٔ کلیدی this» بررسی خواهد شد.
آرگومانهای Primitive مثل int یا double بر اساس مقدار (By Value) به Method ارسال میشوند. این یعنی هر تغییری در مقادیر پارامترها فقط در دامنهٔ Method باقی میماند. وقتی Method بازمیگردد، پارامترها از بین میروند و هرگونه تغییر از بین رفته است.
public class PassPrimitiveByValue {
public static void main(String[] args) {
int x = 3;
// فراخوانی passMethod() با
// x بهعنوان آرگومان
passMethod(x);
// چاپ x برای بررسی تغییر مقدار
IO.println("After invoking passMethod, x = " + x);
}
// تغییر پارامتر در passMethod()
public static void passMethod(int p) {
p = 10;
}
}
خروجی این برنامه:
After invoking passMethod, x = 3
همانطور که میبینید، مقدار x تغییر نکرده است.
پارامترهای Reference Type مثل اشیا نیز بر اساس مقدار به Method ارسال میشوند. اما تفاوت مهمی وجود دارد: هنگامی که Method بازمیگردد، مرجع ارسالشده همچنان به همان شیء قبلی اشاره میکند. با این حال، مقادیر فیلدهای شیء میتوانند در Method تغییر کنند — به شرطی که سطح دسترسی مناسب را داشته باشند.
برای مثال، Method زیر یک شیء Circle را جابهجا میکند:
public void moveCircle(Circle circle, int deltaX, int deltaY) {
// کد جابهجایی مرکز دایره به x+deltaX, y+deltaY
circle.setX(circle.getX() + deltaX);
circle.setY(circle.getY() + deltaY);
// کد اختصاص مرجع جدید به circle
circle = new Circle(0, 0);
}
فرض کنید Method را اینگونه فراخوانی کنید:
moveCircle(myCircle, 23, 56)
در داخل Method، circle در ابتدا به myCircle اشاره میکند. Method مختصات x و y شیءای که circle به آن اشاره میکند (یعنی myCircle) را به ترتیب 23 و 56 واحد جابهجا میکند. این تغییرات پس از بازگشت Method باقی میمانند. سپس circle به یک شیء Circle جدید با مختصات x = y = 0 اختصاص داده میشود. اما این تغییر مرجع پایدار نیست، چون مرجع بر اساس مقدار ارسال شده و قابل تغییر نیست. در داخل Method، شیءای که circle به آن اشاره میکند تغییر کرده، اما پس از بازگشت Method، myCircle همچنان به همان شیء Circle قبلی اشاره میکند.
[دیاگرام: نمایش تفاوت ارسال Reference Type بر اساس مقدار — مرجع اصلی تغییر نمیکند، اما مقادیر فیلدهای شیء تغییر میکنند]
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/