1.重寫(Override)
重寫是子類對父類當中允許訪問的方法的實現過程進行重新編寫,返回值和形參都不能改變。即外殼不變,核心重寫!
重寫的好處在於子類可以根據需要,定義自己特定的行爲, 也就是說子類能夠根據需要實現父類的方法。
重寫方法不能拋出新的檢查異常或者比被重寫方法聲明更加寬泛的異常。例如:父類的一個方法申明瞭一個檢查異常 IOException,但是在重寫這個方法的時候不能拋出 Exception 異常,因爲 Exception 是 IOException 的父類,只能拋出 IOException 的子類異常。
方法的重寫規則如下:
①參數列表必須完全與被重寫方法的相同。如果不能繼承一個方法,則不能重寫這個方法。
②返回類型與被重寫方法的返回類型相同。
③訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明爲 public,那麼在子類中重寫該方法就不能聲明爲 protected。
④父類的成員方法只能被它的子類重寫。
⑤聲明爲 final 的方法不能被重寫。構造方法不能被重寫。
⑥聲明爲 static 的方法不能被重寫,但是能夠被再次聲明。
⑦子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明爲 private 和 final 的方法。
⑧子類和父類不在同一個包中,那麼子類只能夠重寫父類的聲明爲 public 和 protected 的非 final 方法。
⑨重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
下面,我們來看兩個例子:👇👇👇
Example 1:
class AnimalPark {
public void move() {
System.out.println("動物可以移動!");
}
}
class Dogs extends AnimalPark {
public void move() {
System.out.println("狗可以跑和跳!");
}
}
public class Override {
public static void main(String[] args) {
AnimalPark a=new AnimalPark();
AnimalPark b=new Dogs();
a.move();
b.move();
}
}
在上面的例子中可以看到,儘管 b 屬於 AnimalPark 類型,但是它運行的是 Dogs 類的 move方法。
這是由於在編譯階段,只是檢查參數的引用類型。
然而在運行時,Java 虛擬機(JVM)指定對象的類型並且運行該對象的方法。
在上面的例子中,之所以能編譯成功,是因爲 AnimalPark 類中存在 move 方法,然而運行時,運行的是特定對象的方法。
程序運行結果如下:👇👇👇
Example 2:
class AnimalPark {
public void move() {
System.out.println("動物可以移動!");
}
}
class Dogs extends AnimalPark {
public void move() {
System.out.println("狗可以跑和跳!");
}
public void bark() {
System.out.println("狗可以吠叫");
}
}
public class Override {
public static void main(String[] args) {
AnimalPark a=new AnimalPark();
AnimalPark b=new Dogs();
a.move();
b.move();
//b.bark();此行代碼會報錯!!!
}
}
該程序將拋出一個編譯錯誤,因爲 b 的引用類型 AnimalPark 中沒有 bark 方法。
2.重載(Overload)
重載(overloading) 是在一個類中,對一個類進行重新編寫,方法名字相同,而參數不同,返回類型可以相同也可以不同。
每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。
最常用的地方就是構造器的重載。
方法的重載規則如下:
①被重載的方法必須改變參數列表(參數個數或類型不一樣)。
②被重載的方法可以改變返回類型以及訪問修飾符。
③被重載的方法可以聲明新的或更廣泛的檢查異常。
④方法能夠在同一個類中或者在一個子類中被重載。
⑤無法以返回值類型作爲重載函數的區分標準。
下面,我們來看一個重載的例子:👇👇👇
Example 1:
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 "test方法被重載第二次";
}
public String test(String s,int a) {
System.out.println("test4");
return "test方法被重載第三次";
}
}
public class Overload {
public static void main(String[] args) {
Overloading a=new Overloading();
System.out.println(a.test());
a.test(1);
System.out.println(a.test(1,"test3"));
System.out.println(a.test("test4",1));
}
}
在這個例子中,可以看到,我們對類 Overloading 中的 test 方法進行了重載,其中,我們分別修改了參數列表和返回類型,當然了,你也可以修改訪問修飾符、或者聲明其他異常等。程序的運行結果如下:👇👇👇
3.重寫和重載的區別
4.總結
①方法重寫是在子類中存在方法與父類的方法的名字相同,而且參數的個數與類型一樣,返回值也一樣的方法,則稱爲方法的重寫(Overriding)。
②方法重載是一個類中定義了多個方法名相同,而他們的參數的數量不同或數量相同而類型和次序不同,則稱爲方法的重載(Overloading) 。
③方法重寫是子類與父類的一種多態性表現,方法重載是一個類的多態性表現。