程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> JAVA類與對象(八)-----重寫,java類-----重寫

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

編輯:JAVA綜合教程

JAVA類與對象(八)-----重寫,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方法。
  • 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
  • 構造方法不能被重寫。
  • 如果不能繼承一個方法,則不能重寫這個方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved