重寫是子類對父類的容許訪問的方法的實現過程進行從新編寫!返回值和形參都不能改變。即外殼不變,核心重寫!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方法。
當須要在子類中調用父類的被重寫方法時,要使用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類的方法 } }
以上實例編譯運行結果以下:
動物能夠移動 狗能夠跑和走
重載(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)); } }
區別點 | 重載方法 | 重寫方法 |
---|---|---|
參數列表 | 必須修改 | 必定不能修改 |
返回類型 | 能夠修改 | 必定不能修改 |
異常 | 能夠修改 | 能夠減小或刪除,必定不能拋出新的或者更廣的異常 |
訪問 | 能夠修改 | 必定不能作更嚴格的限制(能夠下降限制) |