متدها در جاوا

ناصر نادری | 1393/10/29


بنام خدا  : بعد از یک فاصله زیاد در خدمت دوستان هستیم با یک  آموزش دیگه از جاوا . و اینبارهرآنچه در باره توابع هست براتون توضیح میدم ..

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

تعریف تابع :

 public static int funcName(int a, int b) {
    // بدنه متد
} 

توی تعریف بالا موارد زیر رو داریم :

public static : این همون مدیفایر هست که اینجا توضیح دادم .

int : نوع بازگشتی تابع هست . وقتی تعیین کردید تابع حتما و در هر صورتی بایک مقدار از این نوع برگردونه .

funcName : نام تابع

 int a,int b :  لیست پارامتر ها ی تابع (میتونه بدون پارامتر باشه)

کلا دو نوع متد داریم :

procedure : متدی لدون مقدار بازگشتی که فقط حکم یک زیر برنامه رو داره

function : متدی با مقدار بازگشتی .

توی مثال زیر متدی تعریف میکنیم که دو عدد رو میگره و  عدد بزرگتر رو برمیگردونه :

 public static int minFunction(int n1, int n2) {
    int min;
    if (n1 > n2)
        min = n2;
    else
        min = n1;

    return min; // بازگشت مقدار محاسبه شده در متد 
} 

و برای فراخوانی متد به دو روش عمل میکنیم :

 System.out.println("This is tutorialspoint.com!");//فراخوانی متدی که هیچ مقداری رو برنمیگردونه 
int MaxNUM=minFunction(524,541);//فراخوانی متدی که یک مقدار رو برمیگردونه

وقتی قرار هست متد ما هیچ مقداری رو برنگردونه از کلمه کلیدی void به جای نوع بازگشتی تابع استفاده میکنیم .

به مثال زیر توجه کنید :

 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 

در تمام این فراخوانیها زمانی که داریم متغییری رو بصورت پارامتر به متد ارسال میکنیم  فقط مقدار اون رو ارسال میکنیم یعنی یه کپی از متغییر وارد تابع میشه و هیچ تغییری در خود متغییر داده نمیشه :

 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);
    // فراخوانی swap
    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:

وقتی داخل یک کلاس بیش از یک متد با نام یکسان و پارامترهای متفاوت داشته باشیم در واقع method overloading کردیم . این همون مبحث چند شکلی در شی گرایی هست . یعنی تعریف بیش از یک متد هم نام  ولی با پارامتر های متفاوت  داخل یک کلاس . به مثال زیر توجه کنید :

 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);
    }

    // تعریف متد برای آرگومانهای نوع صحیح
    public static int minFunction(int n1, int n2) {
        int min;
        if (n1 > n2)
            min = n2;
        else
            min = n1;

        return min; 
    }
    // تعریف متد باهمون نام و آرگومانهای نوع دابل
    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 

متد سازنده Constructure Method :

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

 // یک سازنده ساده تعریف شده توسط برنامه نویس.
class MyClass {
    int x;

    // متد سازنده که مقدار دهی اولیه رو انجام میده
    MyClass(int i) {
        x = i;
    }
}

شما وقتی یک object از نوع این کلاس تعریف میکنید متغییر x=i میشه و اینکار همون لحظه تعریف انجام میشه :

 public class ConsDemo {

    public static void main(String args[]) {
        MyClass t1 = new MyClass(10);//در  همین لحظه سازنده فراخوانی میشه
        MyClass t2 = new MyClass(20);
        System.out.println(t1.x + " " +  t2.x);
    }
} 

نتیجه اجرا بالا :

 10 20 

آرگومانهایی با طول متغییر :

در جاوا امکانی وجود داره که در مواقعی که شما تعداد پارامترهاتون رو نمیدونید به متد بگید که هرچقدر که کاربر پارامتر وارد کرد قبول کن . با الگوی زیر :

 typeName... parameterName 

typeName: نوع آرگومان هست     و pararmeterName : لیست آرگومانها هست که مثل یک آرایه در نظر گرفته میشه . مثال زیر روشنترتون میکنه :

 public class VarargsDemo {

        public static void main(String  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 

متد finalize() :

همونطور که یک کلاس سازنده داره میتونه یک خراب کننده هم داشته باشه !!! . یعنی وقتی  حافظه از اون آبجکتی که از نوع کلاس گرفته شده , باز پس گرفته شد چه اتفاقی بیفته ... حافظه از آبجکت توسط garbage collector گرفته میشه و این متد قبل از اینکه این عمل انجام بشه اجرا میشه .

 protected void finalize( )
{
     // کدهایی که وقتی آبجکتمون داره از بین مبره باید اجرا  بشه 
} 

تا جلسه بعد خدا نگهدار............


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید