آموزش overriding در جاوا
در زبان برنامه نویسی جاوا (Java) و مفاهیم شیء گرایی، هنگامی که یک کلاس تابعی را از کلاس پدر ارث بری کند، اگر آن تابع final نباشد، در این صورت این امکان وجود دارد که آن تابع را override کرد.
مزیت overriding این است که می توان رفتارهای کلاس پدر را در صورت نیاز در فرزند تغییر داد، بدین معنی که کلاس فرزند می تواند توابع کلاس پدر را برای خود پیاده سازی کند.
در مفاهیم شیءگرایی، overriding به معنی تغییر کارکرد یک تابع موجود در برنامه می باشد.
مثال:
به مثال زیر توجه کنید.
class Animal{
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal{
public void move(){
System.out.println("Dogs can walk and run");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move();// runs the method in Animal class
b.move();//Runs the method in Dog class
}
}
خروجی برنامه بالا:
Animals can move
Dogs can walk and run
همانطور که در مثال بالا مشاهده کردید، شیء b با این وجود که از نوع Animal می باشد، ولی تابع move کلاس Dog را اجرا می کند. دلیل آن این است که: در زمان کامپایل، چک بر اساس کلاس مرجع یعنی کلاس Animal انجام می گیرد، در صورتی که در زمان اجرا، JVM متوجه نوع شیء شده و تابع کلاس Dog را اجرا می کند.
به همین جهت در مثال بالا، برنامه با این تصور که تابع move کلاس Animal درون شیء b است آن را کامپایل می کند. سپس در زمان اجرا تابع move کلاس فرزند یعنی Dog را اجرا می کند.
به مثال زیر توجه کنید:
class Animal{
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal{
public void move(){
System.out.println("Dogs can walk and run");
}
public void bark(){
System.out.println("Dogs can bark");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal reference and object
Animal b = new Dog(); // Animal reference but Dog object
a.move();// runs the method in Animal class
b.move();//Runs the method in Dog class
b.bark();
}
}
خروجی برنامه:
TestDog.java:30: cannot find symbol
symbol : method bark()
location: class Animal
b.bark();
^
برنامه بالا، خطای زمان کامپایل ایجاد میکند، به این دلیل که شیء b از نوع مرجع Animal تابعی با نام bark ندارد.
قوانین override تابع
- لیست آرگومان های تابع باید دقیقا با لیست آرگومان های تابع override شده یکی باشد.
- نوع مقدار بازگشتی تابع باید همانند یا فرزندی از نوع مقدار بازگشتی تابع override شده کلاس پدر باشد.
- سطح دسترسی تابع نمی تواند محدودتر از سطح دسترسی تابع override شده باشد. برای مثال: اگر تابع کلاس پدر به صورت public تعریف شده باشد، در این صورت تابع کلاس فرزند نمی تواند private یا protected باشد.
- تنها توابعی از کلاس پدر که توسط فرزند ارث بری شده اند می توانند override شوند.
- توابع static نمی توانند override شوند، ولی می توانند دوباره در کلاس فرزند تعریف شوند.
- اگر تابعی نمی تواند ارث برده شود، همانطور هم نمی تواند override شود.
- کلاس فرزند موجود در پکیج یکسان با کلاس پدر، می تواند تمامی توابعی از پدر را که به صورت private یا final تعریف نشده باشند را override کند.
- کلاس فرزند در یک پکیج دیگر از کلاس پدر تنها می تواند توابع public یا protected کلاس پدر را که final نیستند را override کند.
- در override تابع می تواند تمامی exception های چک نشده را throw کرد، بدون در نظر گرفتن اینکه تابع override شده آن exception ها را throw کرده یا خیر. ولی در مورد exception های چک شده، در override تابع نمی تواند exception چک شده جدیدی یا بیشتری در تابع override شده بیشتر از آن چیزی که در تابع کلاس پدر می باشد throw کرد.
- سازنده ها نمی توانند override شوند.