oruji.github.io
oruji.github.ioPersian Tutorials
ویرایش: 1396/11/2 21:04
A A

آموزش overloading در جاوا

overloading تابع، قابلیتی است که به یک کلاس اجازه میدهد، تعداد دو یا بیشتر تابع با نام یکسان داشته باشد.

در overload یک تابع آرگومان های ورودی، دارای تفاوت های به شرح زیر هستند:

  1. تعداد پارامترها.
  2. نوع داده پارامترها.
  3. ترتیب نوع داده پارامترها.

overloading تابع، با عنوان پلی مورفیسم ایستا (static) نیز شناخته میشود.

نکات قابل توجه:

  1. پلی مورفیسم ایستا را فراخوانی زمان کامپایل نیز می نامند.
  2. فراخوانی یک تابع در این حالت در زمان کامپایل برنامه اتفاق می افتد. overloading یک تابع، مثالی از فراحوانی ایستا می باشد.

مثال های overloading تابع:

همانطور پیش تر گفته شد، overloading تابع می تواند با داشتن آرگومان های متفاوت انجام شود. در زیر مثال هایی از حالت های مختلف برای درک بهتر آورده شده است.

مثال 1: تفاوت در تعداد پارامترها

زمانیکه نام توابع یکی باشند ولی تعداد آرگومان های متفاوت باشد.

class DisplayOverloading { public void disp(char c) { System.out.println(c); } public void disp(char c, int num) { System.out.println(c " " num); } } class Sample { public static void main(String args[]) { DisplayOverloading obj = new DisplayOverloading(); obj.disp('a'); obj.disp('a',10); } }

خروجی:

a a 10

در مثال بالا، تابع disp() بر اساس تعداد آرگومان ها overload شده است، ما دو تعریف تابع disp() داریم، یکی با یک آرگومان و دیگری با دو آرگومان.

مثال 2: تفاوت در نوع داده ی آرگومان ها

در این مثال. تابع disp() بر اساس نوع داده آرگومان ها overload شده است، همانند مثال 1 در اینجا نیز دو تعریف از تابع disp() وجود دارد، با این تفاوت که یکی از توابع آرگومانی از توع char دارد و دیگری آرگومانی از نوع int دارد.

class DisplayOverloading2 { public void disp(char c) { System.out.println(c); } public void disp(int c) { System.out.println(c ); } } class Sample2 { public static void main(String args[]) { DisplayOverloading2 obj = new DisplayOverloading2(); obj.disp('a'); obj.disp(5); } }

خروجی:

a 5

مثال 3: ترتیب نوع داده آرگومان ها

در این حالت تابع disp() بر اساس ترتیب نوع داده ی آرگومان های آن overload می شود. هر دوی توابع تربیب متفاوتی از آرگومان ها نسبت به توع داده خواهند داشت. تابع اول آرگومان هایی به صورت (char, int) و دومی به صورت (int, char). تا زمانی که ترتیب آرگومان ها متفاوت باشد، تابع می تواند بدون هیچ مشکلی overload شود.

class DisplayOverloading3 { public void disp(char c, int num) { System.out.println("I’m the first definition of method disp"); } public void disp(int num, char c) { System.out.println("I’m the second definition of method disp" ); } } class Sample3 { public static void main(String args[]) { DisplayOverloading3 obj = new DisplayOverloading3(); obj.disp('x', 51 ); obj.disp(52, 'y'); } }

خروجی:

I’m the first definition of method disp I’m the second definition of method disp

اجازه دهید تعدادی از موارد overload های صحیح و غلط را بررسی کنیم

مورد 1:

int mymethod(int a, int b, float c) int mymethod(int var1, int var2, float var3)

نتیجه: خطای زمان کامپایل. آرگومان ها دقیقا یکسان هستند. هر دو تابع دارای تعداد یکسان، نوع داده یکسان و ترتیب نوع داده یکسان در آرگومان ها می باشند.

مورد 2:

int mymethod(int a, int b) int mymethod(float var1, float var2)

نتیجه: کاملا درست. در اینجا نوع داده ی آرگومان متفاوت هستند.

مورد 3:

int mymethod(int a, int b) int mymethod(int num)

نتیجه: کاملا درست: در اینجا تعداد آرگومان ها متفاوت هستند.

مورد 4:

float mymethod(int a, float b) float mymethod(float var1, int var2)

نتیجه: کاملا درست. ترتیب قرارگیری نوع داده های آرگومان ها متفاوت است. تابع اول دارای (int, float) و تابع دوم دارای (float, int) می باشد.

مورد 5:

int mymethod(int a, int b) float mymethod(int var1, int var2)

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

جواب ها را قبل از چک کردن پایان برنامه حدس بزنید:

پرسش 1: نوع داده بازگشتی، نام تابع و آرگومان ها یکسان.

class Demo { public int myMethod(int num1, int num2) { System.out.println("First myMethod of class Demo"); return num1 num2; } public int myMethod(int var1, int var2) { System.out.println("Second myMethod of class Demo"); return var1-var2; } } class Sample4 { public static void main(String args[]) { Demo obj1= new Demo(); obj1.myMethod(10,10); obj1.myMethod(20,12); } }

پاسخ:

برنامه فوق باعث خطای زمان کامپایل خواهد شد: نمی توان بیشتر از یک تابع با نام یکسان و آرگومان های یکسان در یک کلاس تعریف کرد.

پرسش 2: نوع داده بازگشتی متفاوت. نام تابع و آرگومان های یکسان.

class Demo2 { public double myMethod(int num1, int num2) { System.out.println("First myMethod of class Demo"); return num1 num2; } public int myMethod(int var1, int var2) { System.out.println("Second myMethod of class Demo"); return var1-var2; } } class Sample5 { public static void main(String args[]) { Demo2 obj2= new Demo2(); obj2.myMethod(10,10); obj2.myMethod(20,12); } }

پاسخ:

برنامه فوق باعث خطای زمان کامپایل خواهد شد: نمی توان در یک کلاس، بیشتر از یک تابع با نام یکسان و آرگومان های یکسان داشت، حتی اگر مقدار بازگشتی متفاوت باشد. نوع مقدار بازگشتی تابع تاثیری در overload ندارد.