- Published on
روشهای Overloading و Overriding در زبان جاوا
- نویسندگان
- نام
- هومن امینی
- توییتر
- @HoomanAmini
روشهای Overloading و Overriding در زبان جاوا
در زبان برنامهنویسی جاوا، دو مفهوم Method Overloading و Method Overriding از اصول اصلی شیگرایی محسوب میشوند. این دو قابلیت به ما امکان میدهند تا رفتار متدها را بسته به شرایط تغییر دهیم و در عین حال کد خود را انعطافپذیرتر و خواناتر کنیم. در ادامه، این دو مفهوم به تفصیل توضیح داده میشوند.
Method Overloading
Overloading زمانی اتفاق میافتد که متدهایی با نام یکسان اما با پارامترهای متفاوت در یک کلاس تعریف شوند. این تفاوت میتواند به تعداد یا نوع پارامترها مربوط باشد.
ویژگیها:
- انعطافپذیری: این قابلیت امکان تعریف متدهایی با کاربردهای مختلف اما با یک نام یکسان را فراهم میکند.
- چندریختی در زمان کامپایل: انتخاب متد مناسب در زمان کامپایل صورت میگیرد.
مثال:
class Calculator {
// جمع دو عدد صحیح
int add(int a, int b) {
return a + b;
}
// جمع سه عدد صحیح
int add(int a, int b, int c) {
return a + b + c;
}
// جمع دو عدد اعشاری
double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(2, 3)); // فراخوانی متد با دو عدد صحیح
System.out.println(calc.add(2, 3, 4)); // فراخوانی متد با سه عدد صحیح
System.out.println(calc.add(2.5, 3.5)); // فراخوانی متد با دو عدد اعشاری
}
}
در این مثال، متد add
به سه روش مختلف پیادهسازی شده است که بسته به تعداد و نوع ورودیها متد مناسب انتخاب میشود.
Method Overriding
Overriding زمانی اتفاق میافتد که یک کلاس فرزند متدی با همان نام، امضا (Signature) و نوع بازگشتی متد کلاس والد را دوباره تعریف کند. این قابلیت به ما اجازه میدهد رفتار متد والد را در کلاس فرزند تغییر دهیم.
ویژگیها:
- چندریختی در زمان اجرا: انتخاب متد مناسب در زمان اجرا صورت میگیرد.
- انعطافپذیری در کلاسهای فرزند: امکان بازنویسی رفتار متد کلاس والد وجود دارد.
- قوانین:
- امضای متد باید دقیقا مشابه متد کلاس والد باشد.
- نمیتوان سطح دسترسی متد را محدودتر کرد.
- از علامت
@Override
برای شفافسازی و جلوگیری از خطا استفاده میشود.
مثال:
// کلاس والد
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
// کلاس فرزند
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDog = new Dog(); // Upcasting
myAnimal.sound(); // اجرای متد کلاس والد
myDog.sound(); // اجرای متد بازنویسیشده کلاس فرزند
}
}
در این مثال، متد sound
در کلاس Dog
رفتار جدیدی تعریف میکند و در زمان اجرا متد کلاس فرزند فراخوانی میشود.
تفاوتهای Overloading و Overriding
ویژگی | Overloading | Overriding |
---|---|---|
تعریف | تعریف متدهایی با نام یکسان اما امضای متفاوت در یک کلاس. | بازنویسی متد با همان امضا در کلاس فرزند. |
نوع چندریختی | در زمان کامپایل | در زمان اجرا |
سطح دسترسی | محدودیتی ندارد | نمیتوان محدودتر از والد باشد. |
نوع بازگشتی | میتواند متفاوت باشد | باید یکسان یا همخوان (Covariant) باشد. |
متدهای استاتیک | میتوان Overload کرد | نمیتوان Override کرد. |
نتیجهگیری
- از Overloading زمانی استفاده میشود که بخواهید متدهایی با نام مشابه، اما ورودیهای متفاوت تعریف کنید.
- از Overriding زمانی استفاده میشود که بخواهید رفتار متد والد را در کلاس فرزند بازنویسی کنید.