Java中方法重寫與重載的區別

目錄

1. 方法重載 (Overload)

什么是方法重載?

重載的特點:

重載的示例:

重載的調用:

2. 方法重寫 (Override)

什么是方法重寫?

重寫的特點:

重寫的示例:

重寫的調用:

3. 重寫 vs 重載 對比表

4. 特殊情況和注意事項

靜態方法

私有方法

final 方法

構造方法

5. 實際應用建議

總結


在 Java 面向對象編程中,方法重寫和方法重載是兩個重要但容易混淆的概念。它們都涉及到方法的定義,但有著本質的區別。

1. 方法重載 (Overload)

什么是方法重載?

方法重載是指在同一個類中,允許存在多個同名方法,但這些方法的參數列表必須不同(參數類型、參數個數或參數順序不同)。

重載的特點:

  • 發生在同一個類中
  • 方法名必須相同
  • 參數列表必須不同(類型、個數、順序)
  • 返回類型可以相同也可以不同
  • 訪問修飾符可以不同
  • 可以拋出不同的異常

重載的示例:

public class Calculator {// 方法1:兩個整數相加public int add(int a, int b) {return a + b;}// 方法2:三個整數相加 - 參數個數不同public int add(int a, int b, int c) {return a + b + c;}// 方法3:兩個浮點數相加 - 參數類型不同public double add(double a, double b) {return a + b;}// 方法4:整數和浮點數相加 - 參數順序不同(雖然這里效果類似)public double add(int a, double b) {return a + b;}// 方法5:浮點數和整數相加 - 參數順序不同public double add(double a, int b) {return a + b;}
}

重載的調用:

編譯器根據方法簽名(方法名 + 參數列表)來決定調用哪個重載方法。

Calculator calc = new Calculator();
calc.add(1, 2);        // 調用 add(int, int)
calc.add(1, 2, 3);     // 調用 add(int, int, int)
calc.add(1.5, 2.5);    // 調用 add(double, double)

2. 方法重寫 (Override)

什么是方法重寫?

方法重寫是指子類重新定義父類中已有的方法,提供特定的實現。重寫的方法必須與父類方法有相同的方法簽名返回類型(或是其子類)。

重寫的特點:

  • 發生在繼承關系的父子類之間
  • 方法名必須相同
  • 參數列表必須完全相同
  • 返回類型必須相同或是其子類(協變返回類型)
  • 訪問修飾符不能比父類更嚴格
  • 不能拋出比父類方法更寬泛的檢查異常

重寫的示例:

// 父類
class Animal {public void makeSound() {System.out.println("動物發出聲音");}public Animal getAnimal() {return new Animal();}
}// 子類
class Dog extends Animal {// 重寫 makeSound 方法@Overridepublic void makeSound() {System.out.println("汪汪汪");}// 協變返回類型 - 返回 Dog 類型(Animal 的子類)@Overridepublic Dog getAnimal() {return new Dog();}
}// 另一個子類
class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("喵喵喵");}
}

重寫的調用:

運行時根據對象的實際類型來決定調用哪個方法(多態的體現)。

Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();myAnimal.makeSound(); // 輸出: 動物發出聲音
myDog.makeSound();    // 輸出: 汪汪汪 (多態)
myCat.makeSound();    // 輸出: 喵喵喵 (多態)

3. 重寫 vs 重載 對比表

特性

方法重載 (Overload)

方法重寫 (Override)

發生位置

同一個類中

繼承關系的父子類之間

方法名

必須相同

必須相同

參數列表

必須不同

必須完全相同

返回類型

可以不同

必須相同或是其子類

訪問修飾符

可以不同

不能比父類更嚴格

異常拋出

可以不同

不能拋出更寬泛的檢查異常

調用時機

編譯時決定

運行時決定(多態)

目的

提高方法靈活性

實現多態,定制子類行為

注解

可選使用 @Overload

建議使用 @Override

4. 特殊情況和注意事項

靜態方法

靜態方法可以被"重載",但不能被"重寫"。如果子類定義了與父類相同的靜態方法,這稱為方法隱藏(Method Hiding),不是重寫。

class Parent {static void staticMethod() {System.out.println("Parent static method");}
}class Child extends Parent {static void staticMethod() {  // 這是隱藏,不是重寫System.out.println("Child static method");}
}

私有方法

私有方法不能被重寫,因為它們在子類中不可見。私有方法可以被重載。

final 方法

final 方法不能被重寫,但可以被重載。

構造方法

構造方法可以被重載(在同一個類中),但不能被重寫(因為構造方法不能繼承)。

5. 實際應用建議

  1. 使用 @Override 注解:在重寫方法時加上 @Override 注解,讓編譯器幫助檢查是否正確重寫
  2. 遵守里氏替換原則:子類重寫的方法不應該改變父類方法的預期行為
  3. 謹慎重寫:不要隨意重寫核心方法,特別是 equals(), hashCode(), toString() 等方法
  4. 文檔注釋:為重寫方法添加適當的文檔注釋,說明與父類方法的區別

總結

方法重載和重寫是 Java 多態性的兩種不同表現形式:

  • 重載是編譯時多態,通過不同的參數列表提供方法的不同版本
  • 重寫是運行時多態,通過子類定制父類行為來實現真正的多態

理解它們的區別對于編寫良好的面向對象代碼至關重要。記住這個簡單的口訣:重載同類不同參,重寫異類同參不同實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96380.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96380.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96380.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序發送訂閱消息-一次訂閱,一直發送消息。

實現思路長期訂閱要求太高,需要政府、公共交通等單位才有資格,所以只能使用一次性訂閱。 就像是買奶茶,下單以后,會彈出讓用戶訂閱消息那種。以買奶茶為例:用戶第一次下單成功,點擊了訂閱消息。(一般都有三…

408 Request Timeout:請求超時,服務器等待客戶端發送請求的時間過長。

408 Request Timeout 是 HTTP 狀態碼之一,表示客戶端在發送請求時,服務器等待的時間過長,最終放棄了處理該請求。此問題通常與網絡延遲、客戶端配置、服務器設置或者應用程序的性能有關。1. 常見原因1.1 客戶端問題網絡連接延遲或不穩定&…

MongoDB面試集錦

該書的使用的MongoDB版本是 4.2.01、什么是NoSQL數據庫?NoSQL和RDBMS有什么區別?在那些情況下使用和不使用NoSQL數據庫?NoSQL是非關系型數據庫,NoSQLNot Only SQL 。關系型數據庫采用的是結構化的數據,NoSQL采用的是鍵…

直擊JVM面試題

JVM組成 JVM JVM 就是 Java 程序的運行環境,它通過 類加載、字節碼執行、內存管理、GC、線程調度 等機制,讓 Java 實現了 跨平臺、自動內存管理和高效執行。 它是一個抽象的計算機,能執行以 字節碼(.class 文件) 為單…

地球系統模式(CESM)實踐技術應用及進階

目前通用地球系統模式(Community Earth System Model,CESM)在研究地球的過去、現在和未來的氣候狀況中具有越來越普遍的應用。CESM由美國NCAR于2010年07月推出以來,一直受到氣候學界的密切關注。近年升級的CESM2.0在大氣、陸地、海…

StarRocks導入數據-使用 Broker Load 進行異步導入

目錄 一、背景 二、實操 三、查看導入進度 一、背景 將hive庫數據表導入starrocks. 二、實操 LOAD LABEL user_behavior (DATA INFILE("hdfs://<hdfs_ip>:<hdfs_port>/user/amber/user_behavior_ten_million_rows.parquet")INTO TABLE user_behavior…

c語言,識別到黑色就自動開槍,4399單擊游戲狙擊戰場,源碼分享,豆包ai出品

不好用&#xff0c;識別速度慢&#xff0c;有時候識別不準確#include <windows.h> #include <stdio.h> #include <math.h> HDC hdcScreen; void leftClick(); void RGBtoHSV(int r, int g, int b, int* h, int* s, int* v); int fuzzyFindColor(int x1, int…

電動汽車充電標準之 — SAE J1772“電動汽車傳導充電連接器”簡介

SAE J1772&#xff08;通常讀作 "J seventeen seventy-two"&#xff09;是由美國汽車工程師學會&#xff08;SAE&#xff09;制定的&#xff0c;針對電動汽車傳導充電連接器的北美標準。它規范了電動汽車&#xff08;EV&#xff09;與充電設備&#xff08;EVSE&#…

ZooKeeper Multi-op+樂觀鎖實戰優化:提升分布式Worker節點狀態一致性

系列文章目錄 第一章 ZooKeeper入門概述:Znode,Watcher,ZAB . 第二章 技術解析&#xff1a;基于 ZooKeeper 實現高可用的主-從協調系統&#xff08;通過例子深入理解Zookeeper如何進行協調分布式系統&#xff09; 第三章 基于 ZooKeeper 的主從模式任務調度系統&#xff1a;設…

生產制造過程精益化

一、核心原則&#xff1a;以“消除浪費、創造價值”為核心精益化的本質是通過系統性優化流程&#xff0c;最大化客戶價值&#xff0c;最小化資源浪費&#xff08;時間、成本、庫存等&#xff09;&#xff0c;核心原則包括&#xff1a;1. 價值導向原則定義客戶價值&#xff1a;從…

Ping命令為何選擇ICMP而非TCP/UDP?

在網絡診斷工具中&#xff0c;ping是最常用的命令之一&#xff0c;它用于測試主機之間的連通性。有趣的是&#xff0c;ping命令并不使用TCP或UDP這些傳輸層協議&#xff0c;而是基于網絡層的ICMP協議。這背后的設計選擇體現了計算機網絡協議棧的分層智慧和特定用途的優化。ICMP…

VGGNet:為什么16層簡單堆疊能成為CNN經典?

配套筆記&講解視頻,點擊文末名片獲取 研究背景和動機 在 VGG 出現之前,圖像識別就像“盲人摸象”: 計算機看一張圖,只能憑感覺抓幾個零散的“特征點”, 結果忽好忽壞,時靈時不靈。 大家發現,如果把“看圖的流程”做得更深、更系統,準確率就能蹭蹭往上漲。于是“深一…

springboot+vue醫院診療管理系統(源碼+文檔+調試+基礎修改+答疑)

目錄 一、整體目錄&#xff08;示范&#xff09;&#xff1a; 文檔含項目技術介紹、E-R圖、數據字典、項目功能介紹與截圖等 二、運行截圖 三、代碼部分&#xff08;示范&#xff09;&#xff1a; 四、數據庫表(示范)&#xff1a; 數據庫表有注釋&#xff0c;可以導出數據…

云蝠智能大模型呼叫新模型上線,擁抱AGI

在人工智能浪潮席卷全球的今天&#xff0c;AGI&#xff08;通用人工智能&#xff09;已不再遙不可及&#xff0c;而是正逐步成為驅動產業變革的核心力量。在這場技術革命中&#xff0c;云蝠智能以其前瞻性的戰略布局和技術創新&#xff0c;再次引領行業風向——全新大模型呼叫模…

晨控CK-GW08S-PN與西門子PLC配置Profinet通訊連接操作手冊

晨控CK-GW08S-PN與西門子PLC配置Profinet通訊連接操作手冊晨控CK-GW08S系列作為晨控智能工業級別網關型RFID讀寫器,支持大部分工業協議如RS232、RS485、以太網。支持工業協議Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由協議TCP/IP等。本期主題&#xff1…

【Linux】Linux常用指令合集

本文是小編鞏固自身而作&#xff0c;如有錯誤&#xff0c;歡迎指出&#xff01; 目錄 一、文件與目錄操作 (1) 查看目錄&#xff0c;切換目錄 pwd ls cd &#xff08;2&#xff09;創建、 刪除 mkdir touch rmdir rm cp mv 二、文件的查看及更改 (1)查看和更改 …

MySQL 高級特性與性能優化:深入理解函數、視圖、存儲過程、觸發器

大家好&#xff01;今天我們要深入探討 MySQL 中一些非常重要的高級主題——內置函數、視圖、存儲過程、觸發器、索引、事務和鎖機制。無論你是剛開始學習數據庫的新手&#xff0c;還是經驗豐富的開發者&#xff0c;掌握這些知識點都將極大提升你的開發效率和數據管理能力。一.…

Linux學習:基于環形隊列的生產者消費者模型

目錄1. 環形隊列的概念與實現方法1.1 環形隊列的概念1.2 環形隊列的一般實現方法2. 多線程相關的信號量概念與接口2.1 信號量類型2.2 信號量的初始化與銷毀2.3 信號量的P申請、V釋放操作3. 基于環形隊列實現p、c模型的設計方案3.1 環形隊列&#xff08;ringqueue&#xff09;作…

【左程云算法07】隊列和棧-鏈表數組實現

目錄 ?編輯1&#xff09;隊列的介紹 核心操作 3&#xff09;隊列的鏈表實現和數組實現 使用數組實現隊列 2&#xff09;棧的介紹 核心操作 4&#xff09;棧的數組實現 使用語言內置的實現 使用數組手動實現棧 5&#xff09;環形隊列的實現 leecode622 代碼解析 視頻…

Docker 清理完整指南:釋放磁盤空間的最佳實踐

前言 隨著 Docker 使用時間的增長,系統中會積累大量的容器、鏡像、數據卷和構建緩存,占用大量磁盤空間。本文將詳細介紹如何有效清理 Docker 資源,釋放磁盤空間,保持系統整潔。 Docker 資源類型 Docker 主要占用磁盤空間的資源包括: 容器 (Containers):運行中和已停止…