Java-Override-Overload
Overide,重寫
重寫一般是發生在子類繼承父類後,某些父類方法不適應子類的需求,而此時子類就重寫相同的方法,更加自己的需求,定義自己特定的行為。
簡單列子
public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public void say() { System.out.print("my name is "+name+"," + age + " years old this year"); } }
public class Teacher extends Person{ public Teacher(String name, int age) { super(name, age); } @Override public void say() { System.out.print("my name is " + super.name+"," + age + " years old this year," + "i'm a teacher"); } }
子類Teacher繼承父類Person,並重寫了say,重寫的時候,編譯器會幫你添加註解: override
。
輸入引數寬度
過載對輸入引數的寬度有限制,要求其必須等於父類的寬頻。對於上面的例子,對Person增加一個方法:
/** * 一下子吃超級多的東西 *鍵值對: *key - 食物名稱 *value - 食物數量 * @param map map */ public void eat(Map<String, ? extends Integer> map) { Iterator<String> iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); System.out.println("eat " + key + ", " + map.get(key)); } }
當我們嘗試子類過載方法,並使其輸入引數小於父類的輸出引數(HashMap是Map的一個子集),編譯器提示報錯

Snipaste_2018-11-09_10-29-01.png
若此時我們把 Override
去掉會發生什麼?編譯通過,但當傳入Map的物件時候,會直接呼叫父類方法,而當傳入HashMap物件的時候,編譯器報錯,提示,子類和父類皆有同名方法而引數型別也符合要球。當我們把子類的方法改改:
public void eat(int a) { System.out.print("Teacher, eat"); }
是可以成功,且成功呼叫。
丟擲異常寬度
過載對異常的丟擲寬度有限制嗎?還是同一個方法,父類定義:
/** * 一下子吃超級多的東西 *鍵值對: *key - 食物名稱 *value - 食物數量 * @param map map */ public void eat(Map<String, ? extends Integer> map) throws IOException{ Iterator<String> iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); System.out.println("eat " + key + ", " + map.get(key)); } }
丟擲一個異常 IOException
,如果子類過載,丟擲大於父類的異常 Exception
:

Snipaste_2018-11-09_10-42-36.png
編譯器報錯。那如果寬度小於父類的異常呢?
public class MyIOException extends IOException{ //定義一個繼承IOException的異常 }
@Override public void eat(Map<String, ? extends Integer> map) throws MyIOException { try { super.eat(map); } catch (IOException e) { e.printStackTrace(); } }
或者刪除異常
@Override public void eat(Map<String, ? extends Integer> map) { try { super.eat(map); } catch (IOException e) { e.printStackTrace(); } }
編譯,執行成功。不過如果想要呼叫 super.eat(map)
,因為其有丟擲的異常,且寬度大於子類方法的 MyIOException
,所以需要先捕抓異常。
返回型別
跟輸入型別一樣,必須一致,不能修改。
方法訪問許可權
一定不能做更嚴格的限制(可以降低限制),假如父類的方法宣告為 protected
,則,子類可以過載其為 public
但不能為 private
。
Overload,過載
過載發生在同一個類裡面,名字相同,但是引數一定不同,返回值型別可以相同也可以不同。最常用到的是建構函式。來看一些例子:
//1 protected void eat(Map<String, ? extends Integer> map) throws IOException{ System.out.println("eat Map"); } //2 public void eat(HashMap map) { System.out.println("eat HashMap"); } //3 public void eat() { System.out.println("eat null"); } //4 public boolean eat(int a) { System.out.println("eat a"); return true; }
- 方法的引數一定要不同,在次前提下,其他的隨意
- 方法返回值可以隨意變化
- 方法的丟擲異常也是
- 方法的訪問許可權也是
總結
ofollow,noindex">參考

20171102-1.jpg
區別點 | 重寫(Override) | 過載(Overload) |
---|---|---|
引數 | 一定不能修改 | 必須不同 |
返回值 | 一定不能修改 | 隨意 |
丟擲的異常 | 可以減少,刪除,不能丟擲寬度更大的異常 | 隨意 |
訪問許可權 | 不能做更嚴格的限制 | 隨意 |
-
方法過載是一個類中定義了多個方法名相同,而他們的引數的數量不同或數量相同而型別和次序不同,則稱為方法的過載(Overloading)。
-
方法重寫是在子類存在方法與父類的方法的名字相同,而且引數的個數與型別一樣,返回值也一樣的方法,就稱為重寫(Overriding)。
-
方法過載是一個類的多型性表現,而方法重寫是子類與父類的一種多型性表現。