方法的重寫與重載

Java 重寫(Override)與重載(Overload)


重寫(Override)

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

重寫的好處在於子類能夠根據須要,定義特定於本身的行爲。ide

也就是說子類可以根據須要實現父類的方法。函數

在面向對象原則裏,重寫意味着能夠重寫任何現有方法。實例以下:spa

class Animal{ public void move(){ System.out.println("動物能夠移動"); } } class Dog extends Animal{ public void move(){ System.out.println("狗能夠跑和走"); } } public class TestDog{ 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)指定對象的類型而且運行該對象的方法。it

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

思考如下例子:編譯

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 TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 對象 Animal b = new Dog(); // Dog 對象 a.move();// 執行 Animal 類的方法 b.move();//執行 Dog 類的方法 b.bark(); } }

以上實例編譯運行結果以下:

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

該程序將拋出一個編譯錯誤,由於b的引用類型Animal沒有bark方法。


方法的重寫規則

  • 參數列表必須徹底與被重寫方法的相同;
  • 返回類型必須徹底與被重寫方法的返回類型相同;
  • 訪問權限不能比父類中被重寫的方法的訪問權限更高。例如:若是父類的一個方法被聲明爲public,那麼在子類中重寫該方法就不能聲明爲protected。
  • 父類的成員方法只能被它的子類重寫。
  • 聲明爲final的方法不能被重寫。
  • 聲明爲static的方法不能被重寫,可是可以被再次聲明。
  • 子類和父類在同一個包中,那麼子類能夠重寫父類全部方法,除了聲明爲private和final的方法。
  • 子類和父類不在同一個包中,那麼子類只可以重寫父類的聲明爲public和protected的非final方法。
  • 重寫的方法可以拋出任何非強制異常,不管被重寫的方法是否拋出異常。可是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更普遍的強制性異常,反之則能夠。
  • 構造方法不能被重寫。
  • 若是不能繼承一個方法,則不能重寫這個方法。

Super關鍵字的使用

當須要在子類中調用父類的被重寫方法時,要使用super關鍵字。

class Animal{ public void move(){ System.out.println("動物能夠移動"); } } class Dog extends Animal{ public void move(){ super.move(); // 應用super類的方法 System.out.println("狗能夠跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal b = new Dog(); // Dog 對象 b.move(); //執行 Dog類的方法 } }

以上實例編譯運行結果以下:

動物能夠移動 狗能夠跑和走

重載(Overload)

重載(overloading) 是在一個類裏面,方法名字相同,而參數不一樣。返回類型呢?能夠相同也能夠不一樣。

每一個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。

只能重載構造函數

重載規則

  • 被重載的方法必須改變參數列表;
  • 被重載的方法能夠改變返回類型;
  • 被重載的方法能夠改變訪問修飾符;
  • 被重載的方法能夠聲明新的或更廣的檢查異常;
  • 方法可以在同一個類中或者在一個子類中被重載。

實例

public class Overloading { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2"); } //如下兩個參數類型順序不一樣 public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading o = new Overloading(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"test3")); System.out.println(o.test("test4",1)); } }

重寫與重載之間的區別

區別點 重載方法 重寫方法
參數列表 必須修改 必定不能修改
返回類型 能夠修改 必定不能修改
異常 能夠修改 能夠減小或刪除,必定不能拋出新的或者更廣的異常
訪問 能夠修改 必定不能作更嚴格的限制(能夠下降限制)
相關文章
相關標籤/搜索