آموزش جاوا - متدها
متدها مجموعهای از دستورات هستند که با هم گروهبندی شدهاند تا یک عملیات را انجام دهند. به عنوان مثال، وقتی شما متد System.out.println() را فراخوانی میکنید، سیستم در واقع چندین دستور را به ترتیب اجرا میکند تا یک پیام را در کنسول نمایش دهد.
اکنون خواهید آموخت که چگونه متدهای خود را با عدم بازگشت مقادیر ایجاد کنیدو متدها را بدون پارامتر فراخوانی کنید و انتزاع متد را در طراحی برنامه اعمال کنید.
ایجاد متد
برای توضیح ساختار متد، به مثال زیر توجه کنید:
ساختار
public static int methodName(int a, int b) {
// body
}
اینجا،
-
public static − تغییردهنده (modifier)
-
int − نوع بازگشت (return type)
-
نام متد − نام متد
-
a، b − پارامترهای فرمال
-
int a، int b − لیست پارامترها
تعریف متد شامل سرآیند متد و بدنه متد است. همین مورد در دستورالعمل زیر نشان داده شده است −
دستورالعمل
modifier returnType nameOfMethod (Parameter List) {
// method body
}
دستورالعمل نشان داده شده در بالا شامل موارد زیر است:
-
تغییردهنده − این تغییردهنده نوع دسترسی متد را تعریف میکند و استفاده از آن اختیاری است.
-
نوع بازگشت − ممکن است متد یک مقدار بازگرداند.
-
نام متد − این نام متد است. امضای متد شامل نام متد و لیست پارامترها است.
-
لیست پارامترها − لیست پارامترها، شامل نوع، ترتیب و تعداد پارامترهای متد است. اینها اختیاری هستند و ممکن است متد شامل صفر پارامتر باشد.
-
بدنه متد − بدنه متد تعریف میکند که متد با استفاده از دستورها چه کاری انجام میدهد.
مثال
در اینجا، کد منبع متد تعریف شده بالا به نام min() آمده است. این متد دو پارامتر num1 و num2 را دریافت کرده و بزرگترین عدد بین آنها را برمیگرداند −
/** the snippet returns the minimum between two numbers */
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
فراخوانی متد (Method Calling)
برای استفاده از یک متد، باید آن را فراخوانی کرد. دو روش برای فراخوانی یک متد وجود دارد، یعنی متد یک مقدار برمیگرداند یا هیچ مقداری برنمیگرداند (بدون مقدار بازگشتی).
فرایند فراخوانی متد ساده است. وقتی برنامه یک متد را فراخوانی میکند، کنترل برنامه به متد فراخوانی شده منتقل میشود. این متد فراخوانی شده سپس کنترل را به فراخواننده در دو شرط برمیگرداند، زمانی که −
- دستور بازگشتی (return statement) اجرا میشود.
- پرانتز بسته پایانی متد (method ending closing brace).
متدهایی که بازگشتی void دارند به عنوان فراخوانی یک دستور در نظر گرفته میشوند. به عنوان مثال را در نظر بگیرید −
System.out.println("This is tutorialspoint.com!");
میتوان مفهوم متدی که مقداری برمیگرداند را با مثال زیر فهمید −
int result = sum(6, 9);
در زیر مثالی آمده است برای نمایش اینکه چگونه یک متد تعریف کنیم و چگونه آن را فراخوانی کنیم −
مثال
public class ExampleMinNumber {
public static void main(String[] args) {
int a = 11;
int b = 6;
int c = minFunction(a, b);
System.out.println("Minimum Value = " + c);
}
/** returns the minimum of two numbers */
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
}
این عمل، نتیجه زیر را تولید خواهد کرد −
خروجی
Minimum value = 6
کلیدواژه void
کلیدواژه void به ما امکان میدهد متدهایی بسازیم که هیچ مقداری را برنمیگردانند. در اینجا، در مثال زیر یک متد void به نام methodRankPoints در نظر گرفته شده است. این متد یک متد void است و هیچ مقداری را برنمیگرداند. فراخوانی یک متد void باید یک دستور باشد مانند methodRankPoints(255.7);. این یک دستور جاوا است که با یک علامت نقطهویرگول به پایان میرسد همانطور که در مثال زیر نشان داده شده است.
مثال
public class ExampleVoid {
public static void main(String[] args) {
methodRankPoints(255.7);
}
public static void methodRankPoints(double points) {
if (points >= 202.5) {
System.out.println("Rank:A1");
}else if (points >= 122.4) {
System.out.println("Rank:A2");
}else {
System.out.println("Rank:A3");
}
}
}
این عمل، نتیجه زیر را تولید خواهد کرد −
خروجی
Rank:A1
Passing پارامترها به صورت مقدار
در حین اجرای فرآیند فراخوانی، باید آرگومانها گذرانده شوند. آنها باید به همان ترتیبی که در مشخصات متد وجود دارد، گذرانده شوند. پارامترها میتوانند به صورت مقدار یا به صورت ارجاع گذرانده شوند.
Passing پارامترها به صورت مقدار به معنی فراخوانی یک متد با یک پارامتر است. از طریق این کار، مقدار آرگومان به پارامتر گذرانده میشود.
مثال
برنامه زیر مثالی ازPassing پارامتر به صورت مقدار را نشان میدهد. مقادیر آرگومانها حتی پس از فراخوانی متد، بدون تغییر باقی میمانند.
public class swappingExample {
public static void main(String[] args) {
int a = 30;
int b = 45;
System.out.println("Before swapping, a = " + a + " and b = " + b);
// Invoke the swap method
swapFunction(a, b);
System.out.println("\n**Now, Before and After swapping values will be same here**:");
System.out.println("After swapping, a = " + a + " and b is " + b);
}
public static void swapFunction(int a, int b) {
System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
// Swap n1 with n2
int c = a;
a = b;
b = c;
System.out.println("After swapping(Inside), a = " + a + " b = " + b);
}
}
این عمل، نتیجه زیر را تولید خواهد کرد −
خروجی
Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30
**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45
تابع سربار گذاری (Method Overloading)
وقتی یک کلاس دو یا بیشترین تابعی با نام یکسان داشته باشد اما با پارامترهای متفاوت، به آن تابع چندبار تعریف شده گفته میشود. این با overriding متفاوت است. در overriding، یک تابع همان نام، نوع، تعداد پارامترها و غیره را دارد.
بیایید مثالی را که در قبل برای پیدا کردن کمترین عددهای نوع integer بحث کردیم، در نظر بگیریم. اگر، بگوییم میخواهیم کمترین عدد نوع double را پیدا کنیم. در این صورت، مفهوم چندبار تعریف شده وارد میشود تا دو یا بیشترین تابع با نام یکسان اما با پارامترهای متفاوت را ایجاد کنیم.
مثال زیر همین موضوع را توضیح میدهد −
مثال
public class ExampleOverloading {
public static void main(String[] args) {
int a = 11;
int b = 6;
double c = 7.3;
double d = 9.4;
int result1 = minFunction(a, b);
// same function name with different parameters
double result2 = minFunction(c, d);
System.out.println("Minimum Value = " + result1);
System.out.println("Minimum Value = " + result2);
}
// for integer
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
// for double
public static double minFunction(double n1, double n2) {
double min;
if (n1 > n2)
min = n2;
else
min = n1;
return min;
}
}
این عمل، نتیجه زیر را تولید خواهد کرد −
خروجی
Minimum Value = 6
Minimum Value = 7.3
استفاده از تابع چندبار تعریف شده، برنامه را قابل خواندن میکند. در اینجا، دو تابع با همین نام اما با پارامترهای متفاوت داده شده است. کمترین عدد از نوع integer و double نتیجه است.
استفاده از آرگومانهای خط فرمان
گاهی اوقات ممکن است بخواهید برنامهای را هنگام اجرا با اطلاعاتی فراهم کنید. این کار با ارسال آرگومانهای خط فرمان به تابع اصلی (main()) انجام میشود.
آرگومان خط فرمان، اطلاعاتی است که مستقیماً پس از نام برنامه در خط فرمان وقتی که اجرا میشود قرار میگیرد. دسترسی به آرگومانهای خط فرمان درون برنامهی جاوا بسیار آسان است. آنها به صورت رشتهها در آرایه رشتهای که به تابع اصلی (main()) پاس داده میشود ذخیره میشوند.
مثال
برنامه زیر تمامی آرگومانهای خط فرمانی را که با آن فراخوانی شده است نمایش میدهد −
public class CommandLine {
public static void main(String args[]) {
for(int i = 0; i<args.length; i++) {
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
برای اجرای این برنامه، طبق موارد زیر عمل کنید −
.
$java CommandLine this is a command line 200 -100
این برنامه نتیجه زیر را تولید خواهد کرد −
خروجی
.
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
کلیدواژه this
this یک کلیدواژه در جاوا است که به عنوان یک مرجع به شیء کلاس فعلی درون یک متد نمونه یا یک سازنده استفاده میشود. با استفاده از this میتوانید به اعضای یک کلاس مانند سازندهها، متغیرها و متدها ارجاع دهید.
توجه − کلیدواژه this فقط در داخل متدها یا سازندههای نمونه استفاده میشود.
بطور کلی، کلیدواژه this برای −
-
تمایز متغیرهای نمونه از متغیرهای محلی اگر همنام باشند، درون یک سازنده یا یک متد استفاده میشود.
class Student {
int age;
Student(int age) {
this.age = age;
}
}
-
از یک نوع سازنده (سازنده با پارامتر یا سازنده پیشفرض) دیگر درون یک کلاس فراخوانی شود. این به عنوان فراخوانی صریح سازنده شناخته میشود.
class Student {
int age
Student() {
this(20);
}
Student(int age) {
this.age = age;
}
}
مثال
در اینجا یک مثال استفاده از کلمه کلیدی this برای دسترسی به اعضای یک کلاس آمده است. برنامه زیر را در یک فایل با نام This_Example.java کپی و پیست کنید.
public class This_Example {
// Instance variable num
int num = 10;
This_Example() {
System.out.println("This is an example program on keyword this");
}
This_Example(int num) {
// Invoking the default constructor
this();
// Assigning the local variable num to the instance variable num
this.num = num;
}
public void greet() {
System.out.println("Hi Welcome to Tutorialspoint");
}
public void print() {
// Local variable num
int num = 20;
// Printing the local variable
System.out.println("value of local variable num is : "+num);
// Printing the instance variable
System.out.println("value of instance variable num is : "+this.num);
// Invoking the greet method of a class
this.greet();
}
public static void main(String[] args) {
// Instantiating the class
This_Example obj1 = new This_Example();
// Invoking the print method
obj1.print();
// Passing a new value to the num variable through parametrized constructor
This_Example obj2 = new This_Example(30);
// Invoking the print method again
obj2.print();
}
}
این عمل موجب تولید نتیجهی زیر میشود −
خروجی
This is an example program on keyword this
value of local variable num is : 20
value of instance variable num is : 10
Hi Welcome to Tutorialspoint
This is an example program on keyword this
value of local variable num is : 20
value of instance variable num is : 30
Hi Welcome to Tutorialspoint
متغیرهای آرگومان (متغیرهای var-args)
جاوا JDK 1.5 به شما امکان میدهد تعداد متغیری از آرگومانها با نوع یکسان را به یک متد پاس دهید. پارامتر در متد به صورت زیر اعلام میشود −
typeName... parameterName
در اعلان متد، شما نوع را مشخص میکنید و پس از آن از سه نقطه استفاده میکنید (...). تنها یک پارامتر با طول متغیر میتواند در یک متد مشخص شود و این پارامتر باید آخرین پارامتر باشد. هر پارامتر عادی باید قبل از آن قرار گیرد.
مثال
public class VarargsDemo {
public static void main(String args[]) {
// Call method with variable args
printMax(34, 3, 3, 2, 56.5);
printMax(new double[]{1, 2, 3});
}
public static void printMax( double... numbers) {
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double result = numbers[0];
for (int i = 1; i < numbers.length; i++)
if (numbers[i] > result)
result = numbers[i];
System.out.println("The max value is " + result);
}
}
این عمل باعث تولید نتیجه زیر میشود −
خروجی
The max value is 56.5
The max value is 3.0