Java知多少(29)覆蓋和重載

來源:互聯網
上載者:User

標籤:

在類繼承中,子類可以修改從父類繼承來的方法,也就是說子類能建立一個與父類方法有不同功能的方法,但具有相同的名稱、傳回值類型、參數列表。

如果在新類中定義一個方法,其名稱、傳回值類型和參數列表正好與父類中的相同,那麼,新方法被稱做覆蓋舊方法。

參數列表又叫參數簽名,包括參數的類型、參數的個數和參數的順序,只要有一個不同就叫做參數列表不同。

被覆蓋的方法在子類中只能通過super調用。

注意:覆蓋不會刪除父類中的方法,而是對子類的執行個體隱藏,暫時不使用。

請看下面的例子:

 1 public class Demo{ 2     public static void main(String[] args) { 3         Dog myDog = new Dog("花花"); 4         myDog.say();  // 子類的執行個體調用子類中的方法 5         6         Animal myAnmial = new Animal("貝貝"); 7         myAnmial.say();  // 父類的執行個體調用父類中的方法 8     } 9 }10 class Animal{11     String name;12     public Animal(String name){13         this.name = name;14     }15    16     public void say(){17         System.out.println("我是一隻小動物,我的名字叫" + name + ",我會發出叫聲");18     }19 }20 class Dog extends Animal{21     // 構造方法不能被繼承,通過super()調用22     public Dog(String name){23         super(name);24     }25     // 覆蓋say() 方法26     public void say(){27         System.out.println("我是一隻小狗,我的名字叫" + name + ",我會發出汪汪的叫聲");28     }29 }

 

運行結果:
我是一隻小狗,我的名字叫花花,我會發出汪汪的叫聲
我是一隻小動物,我的名字叫貝貝,我會發出叫聲

方法覆蓋的原則:

  • 覆蓋方法的傳回型別、方法名稱、參數列表必須與原方法的相同。
  • 覆蓋方法不能比原方法訪問性差(即存取權限不允許縮小)。
  • 覆蓋方法不能比原方法拋出更多的異常。
  • 被覆蓋的方法不能是final類型,因為final修飾的方法是無法覆蓋的。
  • 被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
  • 被覆蓋的方法不能為static。如果父類中的方法為靜態,而子類中的方法不是靜態,但是兩個方法除了這一點外其他都滿足覆蓋條件,那麼會發生編譯錯誤;反之亦然。即使父類和子類中的方法都是靜態,並且滿足覆蓋條件,但是仍然不會發生覆蓋,因為靜態方法是在編譯的時候把靜態方法和類的參考型別進行匹配。


方法的重載:
前面已經對Java方法重載進行了說明,這裡再強調一下,Java父類和子類中的方法都會參與重載,例如,父類中有一個方法是 func(){ ... },子類中有一個方法是 func(int i){ ... },就構成了方法的重載。

覆蓋和重載的不同:

  • 方法覆蓋要求參數列表必須一致,而方法重載要求參數列表必須不一致。
  • 方法覆蓋要求傳回型別必須一致,方法重載對此沒有要求。
  • 方法覆蓋只能用於子類覆蓋父類的方法,方法重載用於同一個類中的所有方法(包括從父類中繼承而來的方法)。
  • 方法覆蓋對方法的存取權限和拋出的異常有特殊的要求,而方法重載在這方面沒有任何限制。
  • 父類的一個方法只能被子類覆蓋一次,而一個方法可以在所有的類中可以被重載多次。

系列文章:

Java知多少(1)語言概述

Java知多少(2)虛擬機器(JVM)以及跨平台原理

Java知多少(3) 就業方向

Java知多少(4)J2SE、J2EE、J2ME的區別

Java知多少(5) Java開發環境的搭建

Java知多少(6)第一個程式樣本

Java知多少(7)類與對象

Java知多少(8)類庫及其組織圖

Java知多少(9) import及Java類的搜尋路徑

Java知多少(10)資料類型及變數

Java知多少(11)資料類型轉換

Java知多少(12)運算子

Java知多少(13)流程式控制制

Java知多少(14)數組

Java知多少(15)字串

Java知多少(16)StringBuffer與StringBuider

Java知多少(17)強調一下編程風格

Java知多少(18)類的定義及其執行個體化

Java知多少(19)存取修飾詞(存取控制符)

Java知多少(20)變數的範圍

Java知多少(21)this關鍵字詳解

Java知多少(22)方法重載

Java知多少(23)類的基本運行順序

Java知多少(24)封裝類、拆箱和裝箱詳解

Java知多少(25)再談Java包

Java知多少(26)源檔案的聲明規則

Java知多少(27)繼承的概念與實現

Java知多少(28)super關鍵字

Java知多少(29)覆蓋和重載

Java知多少(29)覆蓋和重載

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.