Java多態詳解

Java多態詳解

什么是多態?

比如我們說:“駕駛一輛車”,有人開的是自行車,有人開的是摩托車,有人開的是汽車。雖然我們都說“開車”,但“怎么開”是由具體的車類型決定的:“開”是統一的動作,具體的行為因車不同而不同。這就是生活中的“多態”現象,同一行為,通過不同的事物,可以體現出來的不同的形態。多態描述的就是這樣的狀態。

多態分為編譯時多態和運行時多態。方法重載(overload)實現的是編譯時多態(靜態多態),而方法重寫(override)實現的是運行時多態(動態多態)。

面向對象編程的三大核心特性:封裝、繼承、多態(這里指的是運行時多態),多態允許同一操作作用于不同對象時產生不同行為。Java中多態的實現依賴于繼承、方法重寫和向上轉型,是代碼靈活性和擴展性的關鍵機制。

多態的核心實現機制

  • 父類引用指向子類對象(向上轉型):用父類類型的變量引用子類對象。
  • 方法重寫:子類對父類中的方法進行重新定義,保持方法簽名相同。
  • 動態綁定:JVM根據對象的實際類型(而非引用類型)決定調用哪個方法。
class Animal {void sound() { System.out.println("動物叫聲"); }
}class Dog extends Animal {@Overridevoid sound() { System.out.println("汪汪"); }
}class Cat extends Animal {@Overridevoid sound() { System.out.println("喵喵"); }
}public class Test {public static void main(String[] args) {Animal a1 = new Dog(); // 向上轉型Animal a2 = new Cat();a1.sound(); // 輸出"汪汪"a2.sound(); // 輸出"喵喵"}
}

我們之所以能在運行時調用子類方法,是因為 Java 支持動態綁定

什么是綁定?

綁定指的是一個方法的調用與**方法所在的類(方法主體)**關聯起來。對java來說,綁定分為靜態綁定(早綁定、編譯時綁定)與動態綁定(晚綁定、運行時綁定)。

靜態綁定

  • 定義:在編譯階段確定方法調用與具體實現的對應關系。
  • 綁定依據:變量聲明類型(編譯時類型)。
  • 典型場景:方法重載、private / static / final 方法調用。

動態綁定

  • 定義:在程序運行期間確定方法調用與具體實現的對應關系。
  • 綁定依據:對象實際類型(運行時類型)。
  • 典型場景:父類引用指向子類對象 + 方法重寫。

多態的使用場景

方法參數多態性

將父類類型作為方法參數,可以接受任意子類對象:

void makeSound(Animal animal) {animal.sound();
}// 調用
makeSound(new Dog()); // 輸出"汪汪"
makeSound(new Cat()); // 輸出"喵喵"

集合中的多態

使用接口或父類類型聲明集合,存儲不同子類對象:

List<String> list = new ArrayList<>(); // 多態的應用
Set<Integer> set = new HashSet<>();

多態的注意事項

方法調用的限制

  • 通過父類引用只能調用父類中聲明的方法。
  • 若需調用子類特有方法,必須向下轉型。

向上轉型與向下轉型

  • 向上轉型:子類 → 父類(包括接口實現類 → 接口),自動完成,無需顯式轉換。
  • 向下轉型:父類 → 子類(包括接口 → 實現類),需顯式轉換,存在ClassCastException風險(必須先用instanceof檢查)。

靜態方法無多態性

靜態方法屬于類,調用時由引用類型決定,而非實際對象類型:

class Parent {static void method() { System.out.println("Parent"); }
}
class Child extends Parent {static void method() { System.out.println("Child"); }
}Parent p = new Child();
p.method(); // 輸出"Parent"(無多態性)

成員變量的訪問

成員變量無多態性,訪問時由引用類型決定:

class Parent { int value = 10; }
class Child extends Parent { int value = 20; }Parent p = new Child();
System.out.println(p.value); // 輸出10

多態的好處

  • 代碼擴展性:新增子類無需修改原有代碼(符合開閉原則)。
  • 降低耦合度:調用方法依賴父類接口,而非具體子類。
  • 統一化處理對象:通過父類引用統一管理多種子類對象(如集合遍歷)。
  • 支持設計模式:如工廠模式、策略模式、模板方法模式等均依賴多態實現。

多態訪問規則總結

口訣

“成員變量,靜態方法看左邊;非靜態方法:編譯看左邊,運行看右邊。”

原理:成員變量和靜態方法無多態性非靜態方法編譯階段檢查父類是否有該方法(確保語法正確),運行階段根據對象實際類型(子類)調用方法(動態綁定)。

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

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

相關文章

問題及解決01-面板無法隨著窗口的放大而放大

在MATLAB的App Designer中&#xff0c;默認情況下&#xff0c;組件的位置是固定的&#xff0c;不會隨著父容器的大小變化而改變。問題圖如下圖所示。 解決&#xff1a; 為了讓Panel面板能夠隨著UIFigure父容器一起縮放&#xff0c;需要使用布局管理器&#xff0c;我利用 MATLA…

【GESP真題解析】第 20 集 GESP 二級 2025 年 3 月編程題 2:時間跨越

大家好,我是莫小特。 這篇文章給大家分享 GESP 二級 2025 年 3 月編程題第 2 題:時間跨越。 題目鏈接 洛谷鏈接:B4260 時間跨越 一、完成輸入 根據題意,輸入包含五行,每行一個正整數,分別代表 y,m,d,h,k。 注意到數據范圍:對于全部數據,保證有 2000≤y≤3000,1≤m≤…

GTS-400 系列運動控制器板卡介紹(二十一)---電子齒輪跟隨

運動控制器函數庫的使用 運動控制器驅動程序、dll 文件、例程、Demo 等相關文件請通過固高科技官網下載,網 址為:www.googoltech.com.cn/pro_view-3.html 1 Windows 系統下動態鏈接庫的使用 在 Windows 系統下使用運動控制器,首先要安裝驅動程序。在安裝前需要提前下載運動…

軟件工程之需求分析涉及的圖與工具

需求分析與規格說明書是一項十分艱巨復雜的工作。用戶與分析員之間需要溝通的內容非常的多&#xff0c;在雙方交流信息的過程中很容易出現誤解或遺漏&#xff0c;也可能存在二義性。如何才能更加準確的表達雙方的意思&#xff0c;且清楚明了&#xff0c;繪制各類圖形就顯得非常…

藍橋杯14屆 數三角

問題描述 小明在二維坐標系中放置了 n 個點&#xff0c;他想在其中選出一個包含三個點的子集&#xff0c;這三個點能組成三角形。然而這樣的方案太多了&#xff0c;他決定只選擇那些可以組成等腰三角形的方案。請幫他計算出一共有多少種選法可以組成等腰三角形&#xff1f; 輸…

在Fiddler中添加自定義HTTP方法列并高亮顯示

在Fiddler中添加自定義HTTP方法列并高亮顯示 Fiddler 是一款強大的 Web 調試代理工具&#xff0c;允許開發者檢查和操作 HTTP 流量。一個常見需求是自定義 Web Sessions 列表&#xff0c;添加顯示 HTTP 方法&#xff08;GET、POST 等&#xff09;的列&#xff0c;并通過顏色區…

數據庫分庫分表實戰指南:從原理到落地

1. 為什么要分庫分表&#xff1f; 1.1 單庫瓶頸表現 存儲瓶頸&#xff1a;單表數據超過5000萬行&#xff0c;查詢性能急劇下降性能瓶頸&#xff1a;單庫QPS超過5000后響應延遲顯著增加可用性風險&#xff1a;單點故障導致全系統不可用 1.2 突破性優勢 --------------------…

Selenium的driver.get_url 和 手動輸入網址, 并點擊的操作,有什么不同?

我在搞爬取的時候&#xff0c;發現有些網站直接用driver.get(url) 跳轉到目標特定的網址的時候&#xff0c;會被強制跳轉到其他的網址上&#xff0c;但是如果是自己手動&#xff0c;在網址欄那里輸入網址&#xff0c;并點回車&#xff0c;卻能完成跳轉。 這是在使用 Selenium …

Java【06】數組查找(二分查找)、排序(冒泡排序、簡單選擇排序)

1. 數組的操作 1.1 數組的反轉 int[] arrs{3,5,7,8,9}; 編寫程序&#xff0c;讓arrs中的數據進行反轉{9,8,7,5,3} 1.2數組的查找 ① 順序查找 從頭到尾一個一個的找&#xff01; ② 二分查找 對數組有一個要求&#xff1a;數組必須是有序(大小)的&#xff01; int num3; int[]…

Redis 基礎詳解:從入門到精通

在當今互聯網應用開發領域&#xff0c;數據存儲與處理的性能和效率至關重要。Redis&#xff08;Remote Dictionary Server&#xff09;作為一款開源的、基于內存的鍵值存儲系統&#xff0c;憑借其出色的性能和豐富的功能&#xff0c;被廣泛應用于數據庫、緩存、消息中間件等場景…

圖片轉ICO圖標工具

圖片轉ICO圖標 可批量操作 下載地址&#xff1a; 鏈接&#xff1a;https://pan.quark.cn/s/6312c565ec98 這個工具是一個批量圖片轉ICO圖標的神器&#xff0c;有了它&#xff0c;以后再也不用為ICO格式的轉換煩惱&#xff01;而且這個軟件特別小巧&#xff0c;完全不用安裝。…

0基礎 | L298N電機驅動模塊 | 使用指南

引言 在嵌入式系統開發中&#xff0c;電機驅動是一個常見且重要的功能。L298N是一款高電壓、大電流電機驅動芯片&#xff0c;廣泛應用于各種電機控制場景&#xff0c;如直流電機的正反轉、調速&#xff0c;以及步進電機的驅動等。本文將詳細介紹如何使用51單片機來控制L298N電…

Flink 系列之十五 - 高級概念 - 窗口

之前做過數據平臺&#xff0c;對于實時數據采集&#xff0c;使用了Flink。現在想想&#xff0c;在數據開發平臺中&#xff0c;Flink的身影幾乎無處不在&#xff0c;由于之前是邊用邊學&#xff0c;總體有點混亂&#xff0c;借此空隙&#xff0c;整理一下Flink的內容&#xff0c…

大疆卓馭嵌入式面經及參考答案

FreeRTOS 有哪 5 種內存管理方式&#xff1f; heap_1.c&#xff1a;這種方式簡單地在編譯時分配一塊固定大小的內存&#xff0c;在整個運行期間不會進行內存的動態分配和釋放。它適用于那些對內存使用需求非常明確且固定&#xff0c;不需要動態分配內存的場景&#xff0c;優點是…

Java 線程池原理

Java 線程池是一種管理和復用線程的機制&#xff0c;其原理如下&#xff1a; 核心概念 線程池的初始化 &#xff1a;在創建線程池時&#xff0c;需要設置一些關鍵參數&#xff0c;如核心線程數&#xff08;corePoolSize&#xff09;、最大線程數&#xff08;maximumPoolSize&am…

大模型都有哪些超參數

大模型的超參數是影響其訓練效果、性能和泛化能力的關鍵設置,可分為以下幾大類別并結合實際應用進行詳細說明: 一、訓練過程相關超參數 學習率(Learning Rate) 作用:控制參數更新的步長,直接影響收斂速度和穩定性。過高會導致震蕩或過擬合,過低則收斂緩慢。調整策略:初…

路由器斷流排查終極指南:從Ping測試到Wireshark抓包5步定位法

測試路由器是否出現“斷流”&#xff08;網絡連接間歇性中斷&#xff09;&#xff0c;需通過多維度排查硬件、軟件及外部干擾因素。以下是詳細步驟指南&#xff1a; 一、基礎環境準備 設備連接 有線測試&#xff1a;用網線將電腦直接連接路由器LAN口&#xff0c;排除WiFi干擾。…

低代碼開發:開啟軟件開發的新篇章

摘要 低代碼開發作為一種新興的軟件開發方式&#xff0c;正在迅速改變傳統軟件開發的模式和效率。它通過可視化界面和預設的模板&#xff0c;使非專業開發者也能夠快速構建應用程序&#xff0c;極大地降低了開發門檻和成本。本文將深入探討低代碼開發的定義、優勢、應用場景以及…

基于Django汽車數據分析大屏可視化系統項目

基于Django汽車數據分析大屏可視化系統項目 一、項目概述 本項目是一個基于 Python 的汽車數據分析大屏可視化系統&#xff0c;旨在通過直觀的可視化界面展示汽車相關數據&#xff0c;幫助用戶更好地理解和分析汽車市場動態、車輛性能等信息。系統采用前后端分離的架構&#…

WebRTC通信原理與流程

1、服務器與協議相關 1.1 STUN服務器 圖1.1.1 STUN服務器在通信中的位置圖 1.1.1 STUN服務簡介 STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT會話穿越應用程序&#xff09;是一種網絡協議&#xff0c;它允許位于NAT&#xff08;或多重 NAT&#xff09;…