鍍金池/ 教程/ Java/ Java 重寫
Java 接口
Java 方法
Java 數(shù)字
Java 條件判斷
Java 異常處理
Java 字符
Java 重寫
Java 網(wǎng)絡(luò)編程
Java 數(shù)據(jù)結(jié)構(gòu)
Java 的對(duì)象和類
Java 多線程
Java 封裝
Java 數(shù)組
Java Applet 基礎(chǔ)
Java 庫(kù)類
Java 抽象
Java 繼承
Java 正則表達(dá)式
Java 描述符的類型
Java 發(fā)送郵件
Java 序列化
Java 泛型
Java 多態(tài)
Java 變量類型
Java 基本數(shù)據(jù)類型
Java 包
Java 快速參考指南
Java 基本運(yùn)算符
Java 概述
Java 字符串
Java 循環(huán)控制
Java 環(huán)境設(shè)置
Java 文件注釋
Java 文件和 I/O
Java 集合
Java 基本語法
Java 日期和時(shí)間

Java 重寫

在上一章節(jié)中,我們討論了父類和子類。如果一個(gè)類從它的父類繼承了一個(gè)方法,如果這個(gè)方法沒有被標(biāo)記為 final ,就可以對(duì)這個(gè)方法進(jìn)行重寫。

重寫的好處是:能夠定義特定于子類類型的行為,這意味著子類能夠基于要求來實(shí)現(xiàn)父類的方法。

在面向?qū)ο缶幊讨校?overriding 意味著去重寫已經(jīng)存在的方法。

示例

讓我們來看以下的例子:

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
   }
}

這將產(chǎn)生如下結(jié)果:

Animals can move
Dogs can walk and run

在上面的例子中,你可以看到盡管 b 是 Animal 類型,但它運(yùn)行了 dog 類的方法。原因是:在編譯時(shí)會(huì)檢查引用類型。然而,在運(yùn)行時(shí),JVM 會(huì)判定對(duì)象類型到底屬于哪一個(gè)對(duì)象。

因此,在上面的例子中,雖然 Animal 有 move 方法,程序會(huì)正常編譯。在運(yùn)行時(shí),會(huì)運(yùn)行特定對(duì)象的方法。

考慮下面的例子:

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();
   }
}

這將產(chǎn)生如下結(jié)果:

TestDog.java:30: cannot find symbol
symbol  : method bark()
location: class Animal
                b.bark();
                 ^

這個(gè)程序在編譯時(shí)將拋出一個(gè)錯(cuò)誤,因?yàn)?b 的引用類型 Animal 沒有一個(gè)名字叫 bark 的方法。

方法重寫規(guī)則

  • 重寫方法的參數(shù)列表應(yīng)該與原方法完全相同。
  • 返回值類型應(yīng)該和原方法的返回值類型一樣或者是它在父類定義時(shí)的子類型。
  • 重寫函數(shù)訪問級(jí)別限制不能比原函數(shù)高。舉個(gè)例子:如果父類方法聲明為公有的,那么子類中的重寫方法不能是私有的或是保護(hù)的。
  • 只有被子類繼承時(shí),方法才能被重寫。
  • 方法定義為 final,將導(dǎo)致不能被重寫。
  • 一個(gè)方法被定義為 static,將使其不能被重寫,但是可以重新聲明。
  • 一個(gè)方法不能被繼承,那么也不能被重寫。
  • 和父類在一個(gè)包中的子類能夠重寫任何沒有被聲明為 private 和 final 的父類方法。
  • 和父類不在同一個(gè)包中的子類只能重寫 non-final 方法或被聲明為 public 或 protected 的方法。
  • 一個(gè)重寫方法能夠拋出任何運(yùn)行時(shí)異常,不管被重寫方法是否拋出異常。然而重寫方法不應(yīng)該拋出比被重寫方法聲明的更新更廣泛的已檢查異常。重寫方法能夠拋出比被重寫方法更窄或更少的異常。
  • 構(gòu)造函數(shù)不能重寫。

使用 super 關(guān)鍵字

當(dāng)調(diào)用父類的被重寫的方法時(shí),要用關(guān)鍵字 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

   }
}

這將產(chǎn)生如下結(jié)果:

Animals can move
Dogs can walk and run
上一篇:Java 基本語法下一篇:Java 異常處理