java中重寫與重載之間的區別

1.什麼是重載(Overload)

如下構造一個空的 StringBuilder 對象:

  • StringBuilder messages = new StringBuilder();

或者, 指定一個初始字符串:

  • StringBuilder todoList = new StringBuilder('To do:\n"😉)

這種特徵叫做重載(overloading。) 如果多個方法(比如, StringBuilder 構造器方法)有 相同的名字、不同的參數, 便產生了重載。 編譯器必須挑選出具體執行哪個方法, 它通過用 各個方法給出的參數類型與特定方法調用所使用的值類型進行匹配來挑選出相應的方法。 如 果編譯器找不到匹配的參數, 就會產生編譯時錯誤, 因爲根本不存在匹配, 或者沒有一個比 其他的更好。(這個過程被稱爲重載解析 (overloading resolution)。)

2.什麼是重寫(Override)

重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!
重寫的好處在於子類可以根據需要,定義特定於自己的行爲。 也就是說子類能夠根據需要實現父類的方法。
重寫方法不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的異常。例如: 父類的一個方法申明瞭一個檢查異常 IOException,但是在重寫這個方法的時候不能拋出 Exception 異常,因爲 Exception 是 IOException 的父類,只能拋出 IOException 的子類異常。
在面向對象原則裏,重寫意味着可以重寫任何現有方法。

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)指定對象的類型並且運行該對象的方法。
因此在上面的例子中,之所以能編譯成功,是因爲Animal類中存在move方法,然而運行時,運行的是特定對象的方法。

2.1方法的重寫規則

  1. 參數列表必須完全與被重寫方法的相同;
  2. 返回類型必須完全與被重寫方法的返回類型相同;
  3. 訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明爲public,那麼在子類中重寫該方法就不能聲明爲protected。
  4. 父類的成員方法只能被它的子類重寫。
  5. 聲明爲final的方法不能被重寫。
  6. 聲明爲static的方法不能被重寫,但是能夠被再次聲明。
  7. 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明爲private和final的方法。
  8. 子類和父類不在同一個包中,那麼子類只能夠重寫父類的聲明爲public和protected的非final方法。
  9. 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
  10. 構造方法不能被重寫。
  11. 如果不能繼承一個方法,則不能重寫這個方法。

3. 重寫與重載之間的區別

4. 總結

  1. (1)方法重載是一個類中定義了多個方法名相同,而他們的參數的數量不同或數量相同而類型和次序不同,則稱爲方法的重載(Overloading)。
  2. (2)方法重寫是在子類存在方法與父類的方法的名字相同,而且參數的個數與類型一樣,返回值也一樣的方法,就稱爲重寫(Overriding)。
  3. (3)方法重載是一個類的多態性表現,而方法重寫是子類與父類的一種多態性表現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章