کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش Java-آموزش Overriding در جاوا

 

در فصل قبل در مورد گروه های اصلی و زیرمجموعه ها صحبت کردیم. اگر یک گروه یک روش را از گروه اصلی دریافت کند، یک شانس برای override کردن متود ارائه شده وجود دارد که به عنوان نهایی مشخص نشده است.

مزیت overriding عبارت است: توانایی تعریف یک رفتار که خاص یک زیرمجموعه می باشد و به این معناست که یک زیرمجموعه می تواند متود یک گروه اصلی را براساس ملزومات آن اجرا کند.

در عبارات object-oriented (آبجکت محور)، 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 اجرا می کند. دلیل آن این است که: در زمان compile، بررسی روی نوع مرجع انجام می شود. به هرحال در زمان اجرا JVM نوع آبجکت را می سنجد و متودی را اجرا می کند که به آن آبجکت خاص تعلق دارد.

بنابراین در مثال بالا، از آنجایی که گروه Animal دارای متود move می باشد، برنامه به درستی کامپایل خواهد شد. سپس در زمان اجرا، متود خاص آن آبجکت را اجرا می کند.

به مثال زیر توجه کنید:

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 نیست، برنامه یک خطای زمان کامپایل را ایجاد می کند.

قوانینی برای method overriding (لغو متود):

·         لیست  argument باید دقیقا مشابه متود لغو شده باشد.

·         نوع گزارش باید مشابه یا زیرمجموعه ای از نوع گزارش اعلام شده در متود لغو شده ی اصلی در گروه اصلی باشد.

·         سطح access نمی تواند محدودتر از سطح access مربوط به متود لغو شده باشد. برای مثال: اگر متود مربوط به گروه اصلی عمومی اعلام شود، سپس متود overriding در زیرمجموعه نمی تواند خصوصی یا محافظت شده باشد.

·         متودهای نمونه تنها در صورتی لغو می شوند (overridden) که به یک گروه غیراصلی برسند.

·         یک متود که نهایی اعلام شده نمی تواند override شود.

·         یک متود که استاتیک اعلام می شود، نمی تواند override شود، اما می تواند دوباره اعلام شود.

·         اگر یک متود inherit نشود، پس override نیز نمی شود.

·         یک زیرمجموعه در همان پوشه به عنوان گروه اصلی نمونه، می تواند هر گروه اصلی را که خصوصی یا نهایی اعلام نشده، override کند.

·         یک گروه غیراصلی در یک پوشه ی متفاوت می تواند تنها متودهای غیرنهایی را که عمومی یا محافظت شده اعلام شده اند، override کند.

·         یک متود overriding می تواند هر exception چک نشده ای را وارد کند، بدون توجه به اینکه آیا متود لغو شده exception وارد می کند یا نه. به هرحال متود overriding نباید exception های چک نشده وارد کند که جدید و یا وسیع تر از موارداعلام شده توسط متود overridden  می باشند. متود overriding می تواند exception های کم تر و محدودتری از متود overridden وارد کند.

·         سازنده ها نمی توانند overridden باشند.

استفاده از لغت کلیدی super:

در هنگام فراخوانی گروه اصلی یک متود overridden لغت کلیدی super استفاده می شود.

class Animal{

 

   public void move(){

      System.out.println("Animals can move");

   }

}

 

class Dog extends Animal{

 

   public void move(){

      super.move(); // invokes the super class method

      System.out.println("Dogs can walk and run");

   }

}

 

public class TestDog{

 

   public static void main(String args[]){

 

      Animal b = new Dog(); // Animal reference but Dog object

      b.move(); //Runs the method in Dog class

 

   }

}

این برنامه نتیجه ی زیر را به دنبال دارد:

Animals can move

Dogs can walk and run

1394/07/27 7257 0
نظرات شما

نظرات خود را ثبت کنید...