JAVA類與對象(八)-----重寫


重寫:子類對父類的允許訪問的方法的實現過程進行重新編寫!返回值和形參都不能改變。即:外殼不變,核心重寫!

好處:可以根據子類的需要,定義特定於自己的行為。也就是說子類能夠根據需要實現父類的方法。

class Animal{

   public void move(){
      System.out.println("動物可以移動");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("狗可以跑和走");
   }
}

public class AnimalThree{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal 對象
      Animal b = new Dog(); // Dog 對象

      a.move();// 執行 Animal 類的方法

      b.move();//執行 Dog 類的方法
   }
}

在上面的例子中可以看到,盡管b屬於Animal類型,但是它運行的是Dog類的move方法。

這是由於在編譯階段,只是檢查參數的引用類型。

然而在運行時,Java虛擬機(JVM)指定對象的類型並且運行該對象的方法。

因此在上面的例子中,之所以能編譯成功,是因為Animal類中存在move方法,然而運行時,運行的是特定對象的方法。

 

下例是錯誤的:

class Animal{

   public void move(){
      System.out.println("動物可以移動");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("狗可以跑和走");
   }
   public void bark(){
      System.out.println("狗可以吠叫");
   }
}

public class AnimalFour{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal 對象
      Animal b = new Dog(); // Dog 對象

      a.move();// 執行 Animal 類的方法
      b.move();//執行 Dog 類的方法
      b.bark();
   }
}

這個例子編譯無法通過,應該將對象b聲明那里改為“Dog b=new Dog();”,得到的正確結果是:

 

 

方法的重寫規則

  • 參數列表必須完全與被重寫方法的相同;
  • 返回類型必須完全與被重寫方法的返回類型相同;
  • 訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明為public,那么在子類中重寫該方法就不能聲明為protected。
  • 父類的成員方法只能被它的子類重寫。
  • 聲明為final的方法不能被重寫。
  • 聲明為static的方法不能被重寫,但是能夠被再次聲明。
  • 子類和父類在同一個包中,那么子類可以重寫父類所有方法,除了聲明為private和final的方法。
  • 子類和父類不在同一個包中,那么子類只能夠重寫父類的聲明為public和protected的非final方法。
  • 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
  • 構造方法不能被重寫。
  • 如果不能繼承一個方法,則不能重寫這個方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM