3 سال پیش / خواندن دقیقه

آموزش متد Overriding در جاوا (به زبان کاملا ساده) با مثال

آموزش متد Overriding در جاوا (به زبان کاملا ساده) با مثال

در این آموزش با کمک مثال ، با متد Overriding جاوا آشنا می شوید.

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

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

مثال ۱ : متد overriding

class Animal {
public void displayInfo() {
System.out.println(“I am an animal.”);
}
}
class Dog extends Animal {
@override
public void displayInfo() {
System.out.println(“I am a dog.”);
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}

خروجی

I am a dog.

در برنامه بالا ، متد ()displayInfo هم در سوپر کلاس Animal و هم در زیرکلاس Dog موجود است.

هنگامی که ما با استفاده از شی d1 (شیء فرعی) ()displayInfo را صدا می زنیم ، متد داخل زیر کلاس Dog فراخوانی می شود. متد ()displayInfo از سوپر کلاس Animal نادیده گرفته می شود.

آموزش متد Overriding در جاوا (به زبان کاملا ساده) با مثال

در مثال ذکر شده به استفاده از حاشیه نویسی override توجه کنید. در جاوا ، حاشیه نویسی ابرداده ای است که برای کامپایلر، اطلاعات تهیه می کند. در اینجا ، حاشیه نویسیoverride برای کامپایلر مشخص می کند که متد بعد از این حاشیه نویسی غلبه بر متد سوپر کلاس را نشان می دهد.

استفاده از override الزامی نیست. با این حال ، هنگامی که از آن استفاده می کنیم ، متد باید کلیه قوانین مهم را رعایت کند. در غیر این صورت ، کامپایلر خطا می دهد.

قوانین overriding جاوا

  • هم سوپر کلاس و هم زیر کلاس باید دارای متد با نام یکسان باشند ، نوع برگشتی و لیست پارامترهای یکسان باید داشته باشند.
  • نمی توانیم متد هایی با عنوان final و static را نادیده بگیریم.
  • همیشه باید متد های انتزاعی سوپر کلاس را نادیده بگیریم.

کلید واژه super در Overridingجاوا

سؤالی متداول که هنگام Overriding در جاوا ایجاد می شود این است:

آیا می توانیم بعد از Overriding به متد سوپرکلاس دسترسی پیدا کنیم؟

جواب بله است. برای دسترسی به متد سوپر کلاس از زیر کلاس ، از کلید واژه super استفاده می کنیم.

مثال ۲ : استفاده از کلمه کلیدی super

class Animal {
public void displayInfo() {
System.out.println(“I am an animal.”);
}
}
class Dog extends Animal {
public void displayInfo() {
super.displayInfo();
System.out.println(“I am a dog.”);
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}

خروجی

I am an animal.

I am a dog.

در مثال بالا ، در زیر کلاس Dog متد () displayInfo  از سوپر کلاس Animal، override شده است. یعنی نادیده گرفته می شود و متد () displayInfo  در کلاس Dog فراخوانی می شود.

وقتی متد ()displayInfo را با استفاده از شی d1 صدا می زنیم ، متد داخل زیرکلاس Dog فراخوانی می شود. متد داخل سوپر کلاس فراخوانی نمی شود.

در داخل ()displayInfo از زیر کلاس Dog ، ما از ()super.displayInfo برای فراخوانی ()displayInfo از سوپر کلاس استفاده کرده ایم.

توجه به این نکته مهم است که سازندگان در جاوا قابل ارث بری نیستند. از این رو ، چیزی به اسم constructor overriding در جاوا وجود ندارد.

با این حال ، می توانیم سازنده سوپرکلاس را از زیر کلاس های آن صدا بزنیم. برای همین ، از ()super استفاده می کنیم.

سطوح دسترسی در متد overriding

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

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

فرض کنید ، یک متد ()myClass در سوپر کلاس protected است. سپس ، همان متد ()myClass در زیر کلاس می تواند public یا protected شود اما private نمی تواند باشد.

مثال ۳ : سطوح دسترسی در Overriding

class Animal {
protected void displayInfo() {
System.out.println(“I am an animal.”);
}
}
class Dog extends Animal {
public void displayInfo() {
System.out.println(“I am a dog.”);
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}

در مثال بالا ، زیر کلاس Dog متد ()displayInfo از سوپر کلاس Animal را نادیده می گیرد.

هرگاه با استفاده از d1 متد ()displayInfo را صدا بزنیم ، متد داخل زیر کلاس صدا زده می شود.

توجه داشته باشید که ()displayInfo در سوپر کلاس Animal از نوع protected است. در همین متد مشخصه دسترسی public در زیر کلاس Dog وجود دارد. این امر به دلیل امکان دسترسی بیشتر از protected امکان پذیر است.

overriding (نادیده گرفتن) متد های انتزاعی(abstract)

در جاوا کلاس های انتزاعی به عنوان سوپرکلاس سایر کلاس ها ایجاد می شوند. اگر یک کلاس شامل یک متد abstract باشد ، نادیده گرفتن آن اجباری است.


شاید از نوشته‌های زیر خوشتان بیاید
نظر خود را درباره این پست بنویسید ...

منوی سریع