【Java】:方法重寫、動態綁定和多態

目錄

一個生動形象的例子

場景設定

1. 方法重寫(Method Overriding)

2. 動態綁定(Dynamic Binding)

3. 多態(Polymorphism)

歸納關系:

重寫

概念

條件

重寫的示例

重載與重寫的區別

動態綁定

定義:

多態性的實現:

與靜態綁定的區別:

示例:

多態

定義

實現方式

實現原理

應用場景

示例

意義


一個生動形象的例子

場景設定

想象一個汽車制造廠,其中有不同類型的車輛,如轎車、SUV和卡車。每種車輛都有自己獨特的駕駛行為,但它們都繼承自一個基本的“汽車”類。

1. 方法重寫(Method Overriding)
  • 定義:子類提供與父類相同方法名、參數列表和返回值類型的方法,以覆蓋父類中的方法。

在這個例子中,假設“汽車”類有一個名為“drive”的方法,它輸出“汽車正在行駛”。但是,轎車、SUV和卡車在行駛時可能有不同的表現,因此它們各自重寫了“drive”方法。

  • 轎車類重寫“drive”方法:輸出“轎車平穩行駛”。
  • SUV類重寫“drive”方法:輸出“SUV越野行駛”。
  • 卡車類重寫“drive”方法:輸出“卡車重載行駛”。
2. 動態綁定(Dynamic Binding)
  • 定義:在運行時根據對象的實際類型來確定調用哪個重寫后的方法。

現在,假設制造廠有一個測試駕駛員,他只需要知道如何“駕駛”(即調用“drive”方法),而不需要知道具體是哪種車型。當他駕駛不同類型的汽車時,會動態地綁定到相應車型重寫的“drive”方法上。

3. 多態(Polymorphism)
  • 定義:允許一個接口(或父類引用)引用多種實際類型,并根據實際類型執行對應的方法。

在測試中,駕駛員可以駕駛不同類型的汽車,而每種車型在行駛時展現出不同的行為,這就是多態的體現。雖然駕駛員都是通過調用“drive”方法來駕駛汽車,但具體的行駛表現卻因車型的不同而不同。

歸納關系:
  • 方法重寫是實現多態的基礎,子類通過重寫父類的方法以提供自己獨特的行為。
  • 動態綁定則使得在運行時能夠根據實際對象的類型來調用相應重寫后的方法,從而實現多態的效果。
  • 多態則是這些技術綜合應用的結果,它允許我們使用統一的接口(如本例中的“drive”方法)來處理不同類型的對象,并在運行時展現出各自獨特的行為。

重寫

概念

方法重寫,是面向對象編程中的一個重要概念,特別是在Java這樣的面向對象的編程語言中。方法重寫允許子類提供一個與父類中已有方法具有相同方法簽名(即方法名和參數列表相同)的實現。

通過方法的重寫,子類可以改變或擴展從父類繼承的方法的行為。


條件

在Java中,要進行方法重寫,必須滿足以下條件:

  • 方法名和參數列表必須與父類中被重寫的方法相同:

這是為了確保在運行時能夠正確地識別和調用重寫的方法。

  • 訪問修飾符不能低于父類方法的訪問修飾符:

例如,如果父類方法時 public 的,那么重寫該方法的方法也必須時 public 的。

  • 返回類型必須與父類中被重寫的方法的返回類型相同
  • 子類方法拋出的異常類型必須是父類方法所拋出異常類型的子集:

子類方法可以不拋出異常,或者拋出與父類方法相同的異常或其子類型的異常。

  • 被重寫的方法不能是 final 或 static 方法:

final 方法不能被重寫,而 static 方法與類關聯而非實例關聯,因此也不適用于重寫???????

重寫的示例

下面是一個簡單的Java示例,展示了如何重寫父類的方法:

class Animal {  public void makeSound() {  System.out.println("Some generic animal sound");  }  
}  class Dog extends Animal {  @Override // 注解表明此方法是重寫父類方法  public void makeSound() {  System.out.println("Bark");  }  
}  public class MethodOverridingExample {  public static void main(String[] args) {  Animal animal = new Dog(); // Animal類型的引用指向Dog類型的對象  animal.makeSound(); // 輸出"Bark",因為Dog類重寫了makeSound方法  }  
}

在這個例子中,Dog 類繼承了 Animal 類,并重寫了 makeSound 方法。當我們通過 Animal 類型的引用調用 makeSound 方法時,實際上調用的是 Dog 類中重寫后的 makeSound 方法,輸出“Bark”。


重載與重寫的區別

  • 重寫發生在父類和子類之間,子類提供與父類相同方法簽名的新實現。
  • 重載發生在同一個類中,允許多個方法擁有相同的名字,但參數列表不同(參數數量、類型或順序不同)。

動態綁定

在Java中,動態綁定(Dynamic Binding)是一個核心概念,它允許在運行時根據對象的實際類型來確定調用哪個方法。這種機制是實現多態性的關鍵,使得程序能夠在運行時靈活地處理不同類型的對象。

定義

動態綁定是指在程序運行過程中,根據具體的實例對象來確定調用哪個方法的過程。它不同于靜態綁定(前期綁定),后者在編譯時就已經確定了方法的調用關系。

多態性的實現

  • 動態綁定是實現多態性的重要因素。多態性允許我們使用父類類型的引用來引用子類的對象,并在運行時確定實際調用的方法。這種機制增加了程序的靈活性和可擴展性。
  • 例如,假設有一個父類 Animal 和一個子類 Dog ,Dog 類重寫了 Animal 類的 makeSound() 方法。當我們創建一個 Dog 對象并將其賦值給一個 Animal 類型的引用時,通過該引用調用 makeSound() 方法,會動態地綁定到 Dog 類的實現上。

與靜態綁定的區別

  • 靜態綁定(也稱為前期綁定或編譯時綁定)是在編譯時就已經確定了方法的調用關系。它通常用于調用靜態方法、私有方法、構造方法以及使用 final 修飾的方法等。
  • 動態綁定則是在運行時根據對象的實際類型來確定方法的調用關系。它主要用于實現多態性,使得程序能夠更加靈活和可擴展。

示例

class Animal {  void makeSound() {  System.out.println("Animal sound");  }  
}  class Dog extends Animal {  @Override  void makeSound() {  System.out.println("Bark");  }  
}  public class DynamicBindingExample {  public static void main(String[] args) {  Animal animal = new Dog(); // 向上轉型  animal.makeSound(); // 動態綁定到Dog類的makeSound()方法上  }  
}

在上述示例中,當我們通過父類類型的引用 animal 調用 makeSound() 方法時,會動態地綁定到 Dog 類的實現上,輸出“Bark”。這就是動態綁定的一個典型應用示例。

注意事項

  • 動態綁定只適用于實例方法,不適用于靜態方法、私有方法和構造方法。這是因為這些方法在編譯時就已經確定了調用關系,無法進行動態綁定。
  • 使用 final 修飾的方法也無法進行動態綁定,因為它們不能被重寫。

多態

在Java編程語言中,多態性是面向對象編程的三大特性之一,它允許一個接口(或基類引用)被多種數據類型所實現,并根據實際的類型執行對應的方法。以下是關于Java中多態的詳細介紹:

定義

多態(Polymorphism)是指允許一個接口(或父類引用)引用多種實際類型,并且可以根據實際的類型來執行對應的方法。簡言之,就是同一個方法調用可以有不同的實現方式。

實現方式

Java中多態的實現主要依賴于繼承和方法重寫。

  • 繼承:子類可以繼承父類的方法定義和屬性,從而具備相同的方法簽名。
  • 方法重寫(覆蓋):子類可以對繼承自父類的方法進行重寫,即在子類中重新定義與父類相同簽名的方法。

實現原理

多態的實現原理主要基于動態綁定(Dynamic Binding),也稱為后期綁定。在運行時,Java虛擬機會根據對象的實際類型來確定調用哪個重寫后的方法。這種機制使得相同的消息(即方法調用)可以根據不同的對象而具有不同的行為。

應用場景

多態在Java編程中有廣泛的應用,以下是幾個常見的應用場景:

  • 接口和抽象類的使用:通過定義接口或抽象類,并在父類中聲明一組方法,具體實現留給子類。這樣,不同的子類可以實現各自獨特的行為。
  • 方法重寫和回調機制:在父類中定義一個回調方法,子類重寫該方法,并由父類對象調用。這樣,根據不同的子類實現,可以執行相應的邏輯。

示例

假設有一個 Animal 類和兩個子類 Dog 和?Cat,每個類都有一個 makeSound 方法。通過多態,我們可以使用一個 Animal 類型的引用來引用 Dog 或 Cat 對象,并調用它們的 makeSound 方法。在運行時,Java虛擬機會根據對象的實際類型(Dog 或 Cat)來確定調用哪個實現。

Animal animal1 = new Dog();  
Animal animal2 = new Cat();  animal1.makeSound(); // 輸出 "Woof!"  
animal2.makeSound(); // 輸出 "Meow!"

意義

多態性提高了代碼的靈活性和可擴展性。通過多態,我們可以編寫更加通用的代碼,而無需關心具體的實現細節。這使得代碼更加易于維護和擴展。

注意事項

  • 多態只適用于實例方法,不適用于靜態方法。因為靜態方法與類關聯,而不是與實例關聯。
  • 多態的實現需要滿足兩個條件:一是方法必須在子類中被重寫;二是必須通過父類引用

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

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

相關文章

CUDA is not availabe on this machine.

assert torch.cuda.is_available(), "CUDA is not availabe on this machine." AssertionError: CUDA is not availabe on this machine. 這個錯誤信息表明你嘗試在PyTorch中使用CUDA(也就是NVIDIA的GPU加速),但是你的機器上似乎沒…

libssh C++封裝之七(File)

1 概述 libssh是一個在客戶端和服務器端實現SSHv2協議的多平臺C庫。使用libssh,您可以遠程執行程序、傳輸文件、使用安全透明的隧道、管理公鑰等等。本文描述的對libssh客戶端功能的C++封裝。 libssh下載地址 3 實現 3.6 File File類型可以讀寫遠程文件。 3.6.1 File定義 …

使用rsync+lnotify實現遠程數據實時同步備份

目錄 1、定時備份與實時備份區別 2、配置客戶端 2.1、在客戶端安裝inotify-tools軟件。以便提供inotifywait inotifywatch 輔助工具程序 2.2 驗證:監控客戶端/data_backup目錄的變化 2.3 編寫自動同步腳本 2.4 后臺運行腳本 2.5 驗證數據實時同步效果 1、定…

【JS面試題】call - apply - bind

推薦嗶站一個老師的視頻講解,非常詳細易懂,5分鐘學會!前端面試題:call、apply、bind的基本概念 這三個都是函數的方法,用來改變函數中的this指向! 關于call的使用:(3個方法類似&am…

SpringCloud:服務拆分和遠程調用

程序員老茶 🙈作者簡介:練習時長兩年半的Java up主 🙉個人主頁:程序員老茶 🙊 P? ?S : 點贊是免費的,卻可以讓寫博客的作者開心好久好久😎 📚系列專欄:Java全棧&#…

使用socat做端口轉發

最近買的云上mongo數據庫但是數據庫不支持外網訪問,準備做iptables轉發但是一直不成功,騰訊云官方給予的解釋是受服務器內啟動的docker影響 做iptables轉發會沖突,所以只能另想辦法,我發現使用socat做轉發也很好用,所以…

JAVA_4

JAVA_4 一、JAVA內存總體架構二、棧的特點如下三、堆的特點如下四、方法區(又叫靜態區,也是堆)特點如下五、this的本質 一、JAVA內存總體架構 多個線程里面有:程序計數器、虛擬機棧、本地方法棧方法區:運行時常量池堆…

FPGA相關論文閱讀

一、Achieving 100Gbps Intrusion Prevention on a Single Server 論文名稱中文翻譯:在單臺服務器上實現100Gbps吞吐量的入侵防御檢測。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…

【回溯 字典樹(前綴樹)】212. 單詞搜索 II

本文涉及知識點 回溯 字典樹(前綴樹) LeetCode212. 單詞搜索 II 給定一個 m x n 二維字符網格 board 和一個單詞(字符串)列表 words, 返回所有二維網格上的單詞 。 單詞必須按照字母順序,通過 相鄰的單元…

第3周 后端微服務基礎架構與前端項目聯調配備

第3周 后端微服務基礎架構與前端項目聯調配備 1. 微服務項目層次設計與Maven聚合1.1 項目層次設計1.2 父項目pom1.2.1 打包方式 1.3 創建通用 ************************************************************************************** 1. 微服務項目層次設計與Maven聚合 1.1…

電商平臺遭遇DDOS、CC攻擊有什么防護方案

電商平臺遭遇DDOS、CC攻擊有什么防護方案?在數字化浪潮的推動下,電商平臺已成為現代商業的重要組成部分,為消費者提供便捷、多樣的購物體驗。然而,隨著業務的發展,電商平臺也面臨著日益嚴峻的網絡安全挑戰,…

Tower for Mac:Git管理的新境界

Tower for Mac,讓您的Git管理進入新境界!這款專為Mac用戶打造的Git客戶端,憑借其出色的性能和豐富的功能,成為眾多開發者的首選工具。 Tower不僅支持常規的Git操作,如提交、推送和拉取,還提供了許多高級功能…

四、VGA項目:聯合精簡幀+雙fifo+sobel算法 實現VGA顯示

前言:該項目實際上是在很多基礎的小練習上合成起來的,例如涉及到uart(rs232)的數據傳輸、雙fifo流水線操作、VGA圖像顯示,本次內容在此基礎上又增添了sobel算法,能實現圖像的邊沿監測并VGA顯示。 文章目錄…

簡單的DbUtils工具類【精細】

目錄 單條通用增刪改方法 1.創建maven項目,并加載依賴 2.創建數據庫連接工具類(Dbutils類) 3.創建一個執行器(SqlExecutor類) 4.通用(增,刪,改)方法 1.創建方法 2.創建userInfo實體類 3.創建測試類,測試增,刪&#xf…

探索數據結構:樹與二叉樹

?? 歡迎大家來到貝蒂大講堂?? 🎈🎈養成好習慣,先贊后看哦~🎈🎈 所屬專欄:數據結構與算法 貝蒂的主頁:Betty’s blog 1. 樹 1.1. 樹的定義 樹是一種非線性的數據結構,它是由n&a…

ORA-609頻繁出現在alert.log,如何解決?

ORA-609就alertlog中比較常見的一個報錯,雖然并沒有太大的影響,但是頻繁的出現在alert log也是很讓人厭煩的事情,本文介紹如何排查解決ORA-609問題。 1.ORA-609官方定義 could not attach to incoming connection Cause Oracle process cou…

【SRC實戰】前端脫敏信息泄露

挖個洞先 https://mp.weixin.qq.com/s/xnCQQCAneT21vYH8Q3OCpw “ 以下漏洞均為實驗靶場,如有雷同,純屬巧合 ” 01 — 漏洞證明 一、前端脫敏,請求包泄露明文 “ 前端脫敏處理,請求包是否存在泄露? ” 1、獲取驗…

|Python新手小白中級教程|第二十八章:面向對象編程(類定義語法私有屬性類的繼承與多態)(4)

文章目錄 前言一、類定義語法二、私有方法和私有屬性1.私有屬性2.私有方法 三、類“繼承”1.初識繼承2.使用super函數調用父類中構造的東西 四、類“多態”1.多態基礎2.子類不同形態3.使用isinstance函數與多態結合判斷類型 總結 前言 大家好,我是BoBo仔吖&#xf…

6818Linux內核開發移植

Linux內核開發移植 Linux內核版本變遷及其獲得 Linux是最受歡迎的自由電腦操作系統內核, 是一個用C語言寫成, 并且符合POSIX標準的類Unix操作系統 Linux是由芬蘭黑客Linus Torvalds開發的, 目的是嘗試在英特爾x86架構上提供自由免費的類Un…

Task Office for Mac v9.0激活版:任務管理新境界

還在為繁瑣的任務管理而煩惱嗎?Task Office for Mac為您帶來全新的任務管理體驗。簡潔明了的界面設計,讓您輕松上手;強大的任務管理和項目管理功能,讓您輕松掌握任務進度;多用戶協作功能,讓團隊協作更加高效…