Java中的方法重寫(Override)與方法重載(Overload)詳解

一、基本概念對比

特性方法重寫(Override)方法重載(Overload)
定義子類重新定義父類中已有的方法同一個類中多個同名方法,參數不同
作用范圍繼承關系中(父子類之間)同一個類內
方法簽名必須相同(方法名+參數列表)必須不同(至少參數類型、個數或順序不同)
返回類型相同或是父類方法返回類型的子類型(協變返回)可以不同
訪問權限不能比父類方法更嚴格可以不同
異常拋出不能拋出比父類方法更多/更寬泛的檢查型異常可以不同
靜態性不能重寫靜態方法(隱藏不算重寫)可以重載靜態方法

二、方法重寫(Override)

1. 重寫規則

  • 必須繼承關系(子類重寫父類方法)
  • 方法名、參數列表必須完全相同
  • 返回類型相同或是其子類(Java 5+支持協變返回)
  • 訪問修飾符不能比父類更嚴格(public > protected > default > private)
  • 不能拋出比父類方法更多的檢查異常(非檢查異常不受限)

2. 代碼示例

class Animal {protected void makeSound() {System.out.println("Animal makes sound");}public Animal getInstance() {return new Animal();}
}class Dog extends Animal {// 正確重寫 - 訪問權限更寬松@Overridepublic void makeSound() {System.out.println("Dog barks");}// 協變返回類型 - 返回Dog而非Animal@Overridepublic Dog getInstance() {return new Dog();}
}

3. @Override注解

  • 非強制但強烈建議使用
  • 幫助編譯器檢查是否滿足重寫條件
  • 提高代碼可讀性
class Cat extends Animal {@Override  // 如果拼寫錯誤會報編譯錯誤public void makeSound() {System.out.println("Cat meows");}
}

4. 不能重寫的情況

  • private方法:對子類不可見
  • final方法:禁止重寫
  • static方法:屬于類而非實例(可以"隱藏"但不是重寫)

三、方法重載(Overload)

1. 重載規則

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

2. 代碼示例

class Calculator {// 整數加法public int add(int a, int b) {return a + b;}// 重載1 - 參數類型不同public double add(double a, double b) {return a + b;}// 重載2 - 參數個數不同public int add(int a, int b, int c) {return a + b + c;}// 重載3 - 參數順序不同public String add(String s, int n) {return s + n;}public String add(int n, String s) {return n + s;}
}

3. 自動類型轉換與重載

class Printer {void print(int i) {System.out.println("int: " + i);}void print(double d) {System.out.println("double: " + d);}void print(String s) {System.out.println("String: " + s);}
}public class Main {public static void main(String[] args) {Printer p = new Printer();p.print(10);     // 調用print(int)p.print(10.0);   // 調用print(double)p.print("10");   // 調用print(String)p.print(10L);    // 自動轉換,調用print(double)}
}

四、特殊場景分析

1. 父子類中的重載

class Parent {void process(int i) {System.out.println("Parent int: " + i);}
}class Child extends Parent {// 這是重載而非重寫void process(double d) {System.out.println("Child double: " + d);}
}public class Test {public static void main(String[] args) {Child c = new Child();c.process(5);    // 調用Parent.process(int)c.process(5.0);  // 調用Child.process(double)}
}

2. 可變參數與重載

class VarArgsDemo {void process(int... nums) {System.out.println("Processing numbers");}void process(String... strs) {System.out.println("Processing strings");}// 會與上面兩個方法沖突// void process(int n, String... strs) { ... }
}

3. 泛型方法重載

class GenericOverload {// 編譯錯誤 - 類型擦除后簽名相同// void process(List<String> list) { ... }// void process(List<Integer> list) { ... }// 合法重載void process(String s) { ... }void process(Integer i) { ... }
}

五、面試常見問題

1. 重寫與重載的區別是什么?

  • 重寫:父子類間,相同簽名,實現不同
  • 重載:同類中,不同簽名,功能相似

2. 構造方法能重寫嗎?

  • 不能,構造方法不能被繼承
  • 但可以重載(一個類中多個構造方法)

3. main方法能重寫或重載嗎?

  • 不能重寫(static方法)
  • 可以重載(但只有public static void main(String[])是入口)

4. 以下代碼輸出什么?

class A {void m1(Object o) { System.out.println("A"); }
}class B extends A {void m1(String s) { System.out.println("B"); }
}public class Test {public static void main(String[] args) {A a = new B();a.m1("hello");  // 輸出"A"(因為m1(String)沒有重寫m1(Object))}
}

六、最佳實踐

  1. 重寫時總是使用@Override

    • 防止意外創建重載而非重寫
    • 提高代碼可讀性
  2. 重載方法應保持功能一致

    • 不同參數形式實現相同功能
    • 避免讓使用者困惑
  3. 謹慎使用可變參數重載

    • 容易導致調用歧義
    • 編譯器可能無法確定最佳匹配
  4. 避免過于復雜的重載設計

    • 參數類型差異應明顯
    • 考慮使用不同方法名提高可讀性
  5. 注意自動裝箱與重載

void process(Integer i) { ... }
void process(long l) { ... }process(5);  // 調用process(long),因為不需要自動裝箱

通過深入理解方法重寫和重載的區別與應用場景,可以設計出更加清晰、靈活的類結構,這是Java面向對象編程的重要基礎。

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

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

相關文章

發布一個npm包,更新包,刪除包

發布一個npm包&#xff0c;更新包&#xff0c;刪除包 如何將自己的項目 發布為一個 npm 包&#xff0c;并掌握 更新 和 刪除 的操作流程。 &#x1f680; 一、發布一個 npm 包的完整流程 ? 1. 注冊并登錄 npm 賬號 如果還沒有賬號&#xff0c;先注冊&#xff1a; 官網注冊&…

Linux系統之----進程的概念

1.進程 1.1基本概念 課本概念 &#xff1a;進程是程序的一個執行實例&#xff0c;是正在執行的程序。當程序被執行時&#xff0c;系統會為其創建一個進程&#xff0c;包含程序代碼、數據以及運行時所需的資源。 內核觀點 &#xff1a;進程是擔當分配系統資源&#xff08;CPU…

Shell腳本中的字符串截取和規則變化

文章目錄 前言if通配符判斷if判斷多個條件規則變化字符串的兩個示例改變中間段數字改變末尾段數字 總結 前言 科技的發展會帶來習慣的改變&#xff0c;特別是對于我們這批敲代碼的&#xff0c;之前還積累一些奇巧淫技&#xff0c;想著在必要的時候賣弄一下&#xff0c;自從生成…

c語言修煉秘籍 - - 禁(進)忌(階)秘(技)術(巧)【第七式】程序的編譯

c語言修煉秘籍 - - 禁(進)忌(階)秘(技)術(巧)【第七式】程序的編譯 【心法】 【第零章】c語言概述 【第一章】分支與循環語句 【第二章】函數 【第三章】數組 【第四章】操作符 【第五章】指針 【第六章】結構體 【第七章】const與c語言中一些錯誤代碼 【禁忌秘術】 【第一式】…

Feign 深度解析:Java 聲明式 HTTP 客戶端的終極指南

Feign 深度解析&#xff1a;Java 聲明式 HTTP 客戶端的終極指南 Feign 是由 Netflix 開源的 ?聲明式 HTTP 客戶端&#xff0c;后成為 Spring Cloud 生態的核心組件&#xff08;現由 OpenFeign 維護&#xff09;。它通過注解和接口定義簡化了服務間 RESTful 通信&#xff0c;并…

如何Ubuntu 22.04.5 LTS 64 位 操作系統部署運行SLAM3! 詳細流程

以下是在本地部署運行 ORB-SLAM3 的詳細步驟&#xff0c;基于官方 README.md 和最佳實踐整理&#xff0c;適用于 Ubuntu 16.04/18.04/20.04/22.04 系統&#xff1a; 一、系統要求與依賴項安裝 1. 基礎系統要求 操作系統&#xff1a;Ubuntu 16.04/18.04/20.04/22.04&#xff…

USB 共享神器 VirtualHere 局域網內遠程使用打印機與掃描儀

本文首發于只抄博客,歡迎點擊原文鏈接了解更多內容。 前言 很久之前,有分享過使用 CUPS 和路由器來實現局域網內共享打印機,但由于 SANE 支持的打印機較少以及掃描驅動的缺失,試了很多種方法都沒有辦法成功遠程使用打印機的掃描功能。 后面偶然發現 VirtualHere 可以曲線…

一洽智能硬件行業解決方案探索與實踐

一、智能硬件行業發展現狀剖析 在數字化浪潮推動下&#xff0c;智能硬件行業呈現蓬勃發展態勢。軟硬件一體化的深度融合&#xff0c;構建起智能化服務的核心架構&#xff0c;而移動應用作為連接用戶與設備的重要橋梁&#xff0c;其作用愈發關鍵。深入研究該行業&#xff0c;可…

【C++ 類和數據抽象】構造函數

目錄 一、構造函數的基本概念 1.1 構造函數核心特性 1.2 構造函數的作用 1.3 構造函數類型體系 二、構造函數的類型 2.1 默認構造函數 2.2 帶參數的構造函數 2.3 拷貝構造函數 2.4 移動構造函數&#xff08;C11 及以后&#xff09; 三、初始化關鍵技術 3.1 成員初始…

圖數據庫nebula測試指南

概述 Nebula是一個開源的分布式圖數據庫系統&#xff0c;專為處理超大規模關聯數據而設計。可以將復雜的關聯關系存在nebula圖數據庫中&#xff0c;提供可視化平臺用于案件關聯查詢及調查。測試的前提是了解nebula圖數據庫&#xff0c;會使用基本的插入語句和查詢語句&#xf…

dispaly: inline-flex 和 display: flex 的區別

display: inline-flex 和 display: flex 都是 CSS 中用于創建彈性盒子布局&#xff08;Flexbox&#xff09;的屬性值&#xff0c;但它們之間有一些關鍵的區別&#xff0c;主要體現在元素如何在頁面上被渲染和它們對周圍元素的影響。 主要區別 1&#xff0c;塊級 vs 行內塊級 d…

Sqlserver安全篇之_Sqlcmd命令使用windows域賬號認證sqlserver遇到問題如何處理的案例

sqlcmd https://learn.microsoft.com/zh-cn/sql/tools/sqlcmd/sqlcmd-connect-database-engine?viewsql-server-ver16 sqlcmd -S指定的數據庫連接字符串必須有對應的有效的SPN信息&#xff0c;否則會報錯SSPI Provider: Server not found in Kerberos database. 正常連接 1、…

電腦硬盤常見的幾種接口類型

一、傳統接口&#xff08;機械硬盤為主&#xff09; 1. SATA 接口&#xff08;Serial ATA&#xff09; 特點&#xff1a; 最主流的機械硬盤&#xff08;HDD&#xff09;接口&#xff0c;廣泛用于臺式機和筆記本電腦。傳輸速度較慢&#xff0c;理論最大帶寬為 6 Gbps&#xff…

【前端HTML生成二維碼——MQ】

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 前端HTML生成二維碼——MQ 前言本文將介紹前端HTML如何更具用戶輸入的內容生成對應的二維碼,附頁面代碼、實現函數、js腳本。一、自定義顯示頁面1、效果圖二、使用步驟1、引入庫2、實現函數3、頁面及函數代…

研發效率破局之道閱讀總結(3)工程優化

研發效率破局之道閱讀總結(3)工程優化 Author: Once Day Date: 2025年4月22日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: 程序的藝術_Once-Day…

C# MP3 伴奏

使用建議&#xff1a; 參數調節指南&#xff1a; 低頻人聲殘留&#xff1a;降低CenterFrequency(800-1500Hz) 高頻人聲殘留&#xff1a;提高CenterFrequency(2500-3500Hz) 消除力度不足&#xff1a;提高EliminationStrength(0.9-1.0) 伴奏失真&#xff1a;降低EliminationSt…

大模型面經 | 春招、秋招算法面試常考八股文附答案(四)

大家好,我是皮先生!! 今天給大家分享一些關于大模型面試常見的面試題,希望對大家的面試有所幫助。 往期回顧: 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題一) 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題二) 大模型面經 | 春招、秋招算法…

Springboot 集成 RBAC 模型實戰指南

RBAC 模型核心原理 詳情可參考之前的筆記&#xff1a;https://blog.csdn.net/qq_35201802/article/details/146036789?spm1011.2415.3001.5331 RBAC 定義與優勢 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的訪問控制&#xff09;** 是一種通過角色關聯…

如何收集用戶白屏/長時間無響應/接口超時問題

想象一下這樣的場景:一位用戶在午休時間打開某電商應用,準備購買一件心儀已久的商品。然而,頁面加載了數秒后依然是一片空白,或者點擊“加入購物車”按鈕后沒有任何反饋,甚至在結算時接口超時導致訂單失敗。用戶的耐心被迅速消耗殆盡,關閉應用,轉而選擇了競爭對手的產品…

用戶需求報告、系統需求規格說明書、軟件需求規格說明的對比分析

用戶需求報告、系統需求規格說明書&#xff08;SyRS&#xff09;和軟件需求規格說明書&#xff08;SRS&#xff09;是需求工程中的關鍵文檔&#xff0c;分別對應不同層次和視角的需求描述。以下是它們的核心區別對比&#xff1a; ??1. 用戶需求報告&#xff08;User Requirem…