فصل ۱۶: اورلود (Overload) و اورراید (Override) متدها در جاوا

0 51

در صورتی که یک کلاس چندین متد با اسم یکسان داشته باشد و تنها تعداد پارامترهای آنها متفاوت باشد، متد اورلود (Overload) اتفاق افتاده است. در صورتی که تمام متدها کار یکسانی را انجام میدهند، ترجیحا برای خوانایی بهتر توصیه به استفاده از متد اورلود می شود.

برای مثال در نظر بگیرید که عملیات جمع را می خواهید روی چند عدد انجام دهید. می توانید یک متد با دو پارامتر برای جمع کردن دو پارامتر، یک متد با سه پارامتر برای جمع کردن سه پارامتر و… داشته باشید. از آنجایی که تمام این متدها یک کار را انجام میدهند، توصیه می شود که تمام متدها اسم یکسانی داشته باشند (مثلا add).

مزیت استفاده از متد اورلود این است که خوانایی کد را بالا می برد.

راه های اورلود (Overload) متد در جاوا

  1. تغییر تعداد آرگومان‌های ورودی
  2. تغییر نوع داده آرگومان های ورودی

توجه داشته باشید که در صورت تغییر دادن نوع داده بازگشتی، اورلود اتفاق نمی افتد.

1- تغییر دادن تعداد آرگومان های ورودی

در این مثال همان متد جمع اعداد را پیاده سازی کردیم  و ضمنا از متدهای استاتیک استفاده کردیم تا مجبور به ساخت شی نشویم.

مثال:

خروجی:

2- تغییر دادن نوع داده آرگومان های ورودی

متد اول داده هایی از نوع عدد صحیح و دیگری متدهایی از نوع عدد اعشاری یا double دارد.

مثال:

خروجی:

سوال: چرا با تغییر نوع داده بازگشتی متد اورلود اتفاق نمی افتد؟

به خاطر پیچیدگی برنامه و ایجاد ابهام، در جاوا امکان متد اورلود با تغییر نوع داده بازگشتی وجود ندارد. به مثال زیر توجه کنید:

مثال:

خروجی:

اورلود main()

امکان اورلود کردن main() نیز با استفاده از تکنیک هایی که گفته شد وجود دارد اما JVM تنها متد main() که آرگومان ورودی آن آرایه‌ای از رشته‌ها باشد را اجرا می کند.

مثال:

خروجی:

معرفی مفهوم Overload در جاوا

ارتقا نوع داده در متد اورلود (Overload)

در صورتی که آرگومان ورودی ما دقیقا با نوع آرگومانی که در متد مشخص شده است، یکسان نباشد، آنگاه در بعضی اوقات ارتقا نوع داده یا Type Promotion اتفاق می افتد. به این معنا که از int می توان به جای float، double و long استفاده کرد یا از short می توان به جای int، float و… استفاده کرد. در شکل بالا به صورت کامل مشخص شده است این موارد. برای یادگیری این مفهوم مثال زیر را با دقت ببینید:

مثال:

خروجی:

به مثال زیر نیز توجه کنید. در این مثال با اینکه از int می توان به جای long استفاده کرد اما به دلیل وجود متد با آرگومان های int، همان متد اجرا می شود.

مثال:

خروجی:

مثال زیر هم یک مثال نادر است که کامپایلر متوجه نمیشود که کدام متد را باید اجرا کند و در نتیجه ارور می دهد.

مثال:

خروجی:

اورراید (Override) متد در جاوا

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

دلیل اورراید کردن متدها، اختصاصی کردن عملکرد یک متد در کلاس فرزند و دستیابی به چندریختی یا پلی مورفیسم است.

قوانین اورراید (Override) متد در جاوا

  1. نام متد در دو کلاس فرزند و پدر یکسان باشد
  2. پارامترهای یکسانی هر دو متد داشته باشند.
  3. رابطه پدرفرزندی یا IS-A برقرار باشد.

حال بگذارید ببینیم اگر امکان اورراید نباشد چه اتفاقی می افتد:

مثال:

خروجی:

حال مثال بالا را به کمک روش اورراید پیاده سازی می کنیم. توجه کنید:

مثال:

خروجی:

انواع روابط در جاوا

در ادامه یک مثال کاربردی تر میبینیم که یک کلاس پدر به نام Bank وجود دارد که بانک های مختلف از آن ارث بری کرده و هرکدوم نرخ بهره خاصی رو اعمال کردند.

مثال:

خروجی:

سوال: آیا امکان اورراید کردن متدهای استاتیک وجود دارد؟

خیر؛ امکان اورراید کردن متدهای استاتیک وجود ندارد. علتش هم این است که متدهای استاتیک مربوط به نمونه خاصی نیستند بلکه مربوط به خود کلاس است پس امکان اورراید آن وجود ندارد. در ضمن توجه کنید که نمونه های ما در بخش heap قرار دارند.

سوال: آیا امکان اورراید main() وجود دارد؟

خیر زیرا یک متد استاتیک است.

ارسال نظر

توجه:‌ آدرس ایمیل شما منتشر نخواهد شد.