Java 之 多態

一、多態

  • 多態故名思義,多種狀態。比如Animal 這個類中,eat 方法是 公共的方法,但是當 People,Dog , Cat,繼承時,我們知道人要吃的是米飯,狗要吃的是狗糧,貓要吃的是貓糧。所以當不同類型的引用(不同的對象)調用同一方法時,雖然是同一方法,但是產生的效果卻是不一樣的,這就叫多態

1.1、多態的概念

  • 當不同的引用(不同的對象)調用同一方法時,產生不同的結果

1.2、多態的實現條件(缺一不可)

  • 需要在繼承的前提下
  • 子類需要對父類的方法進行重寫
  • 需要父類的引用調用重寫方法

1.3、多態的好處

  • 比如說以前的手機來電,他只能顯示電話號碼。現在的手機不僅可以顯示電話號碼,還顯示名字,地址。這樣的改變,如果我有多態,就不需要對以前的代碼進行修改,我只需要重新創建一個類,繼承以前的那個類,重寫一下來電顯示那個方法就行
  • 這樣使得代碼的可擴展性更強了

二、重寫

  • 在重寫代碼的前一行,加上@Override,可以讓編譯器幫我們效驗我們重寫得對不對
  • 重寫和重載都是多態的表現

2.1、什么是重寫?

  • 重寫是對父類的方法,在子類中重新寫
  • 在子類中的方法,訪問權限要大于等于父類的,類型要完全相同,方法名要完全一樣,參數列表也要完全一樣

2.2、重寫的規則

  • 子類中的重寫方法的訪問權限要大于等于父類中的
  • 父類中需要重寫的方法不能用 static, private ,final修飾,否則不能重寫,構造方法也不能重寫
  • 子類中的重寫方法的返回值類型可以和父類的不一樣,但是這個返回值類型必須和父類構成繼承關系,這個叫協變類型

2.3、重寫和重載的區別

  • 訪問權限:重寫:要求必須大于或等于父類的訪問權限,重載:要求要相同
  • 返回值類型:重寫:要求要完全一致,重載:不要求
  • 方法名:重寫:要求完全一致,重載:也是要求完全一致
  • 參數列表:重寫:要求完全一致,重載:參數列表必須不同(類型,名字,順序)

2.4、動態綁定

  • 比如說我用 Animal 類,實例化一個Dog 對象(向上轉型),我們知道,animal這個引用雖然指的是Dog,但是animal 的類型是Animal,所以animal這個引用只能調用Animal中的成員,不能調用Dog中特有的成員。換句話說,父類的引用只能調用父類中的成員,不能調用子類的成員。更深層的意思就是,發生了向上轉型不能調用制類特色的成員
  • 什么是動態綁定?動態綁定也叫做運行時綁定。當我用animal調用重寫的方法時,本應該調用的是父類中的方法,但是實際是調用了子類中的重寫方法。這就是動態綁定
class Animal {public void eat(){sout("父類"+"正在吃飯...")}
}
class Dog extends Animal{
@Overridepublic void eat(){           //重寫父類方法sout("子類"+"正在吃飯...")}
}
class Tect{Animal animal = new Dog();  //向上轉型//此時調用的eat本應調用的是父類的eat,但實際是調用了子類Dog中的eat,因為此時發生了動態綁定animal.eat;                    //父類引用調用重寫方法//所以說發生了多態
}
  • 同一個引用調用同一個方法,當這個引用 ,引用的對象不一樣的時候,調用方法產生的結果也不一樣,此時我們就把這種思想稱之為多態

2.5、靜態綁定

  • 什么是靜態綁定?靜態綁定也叫做(就是在寫代碼時綁定)編譯時綁定。例子就是重載,跟據所傳入的參數來調用合適的方法,此時就發生了靜態綁定。(因為方法名字一樣,所以根據你傳入的參數來綁定要調用的方法,這就叫編譯時綁定)

三、向上轉型和向下轉型

3.1、什么是向上轉型,什么是向下轉型?

  • 向上轉型就是父類引用指向子類對象
Animal animal = new Dog();
  • 向下轉型就是子類引用指向父類對象
Dog dog = (Dog)new Animal();

3.1.2、在向上轉型中兩個類型不一樣,為什么不需要強制類型轉換?

  • 可以這么說,狗一定是動物,但動物不一定是狗,所以向下轉型需要強轉

3.2、使用場景

  • 直接賦值
Animal animal = new Dog();
  • 作為參數傳遞
public static void get(Animal animal){     //把dog傳過來就發生了向上轉型animal.draw();
}
Dog dog = new Dog();
get(dog);
  • 作為返回值傳遞
public Animal get(){             //返回值應該是Animal類型return new Dog();           //但返回值是Dog實例化出來的對象,發生了向上轉型
} 

3.3、需要注意什么?

  • 向上轉型和向下轉型,其實都是為了類型的統一
  • 向下轉型需要注意,因為動物不一定是狗。所以可以使用 instanceof 關鍵字來讓編譯器效驗是不是強轉的類型,即用該關鍵字驗證animal 所指的對象是不是狗,這樣使用instanceof 保證了向下轉型的安全性
Animal animal = new Dog();
if(animal instanceof Dog){Dog dog1 = (Dog) animal;
}else if(animal instanceof Cat){Cat cat = (Cat) animal;
}

四、避免在構造方法中調用重寫方法

  • 因為極易出現很難找出的隱藏問題

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

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

相關文章

文件結構樹的├、└、─ 符號

目錄一、├、└、─符號的背景二、├、└、─ 符號的含義2.1 ├ 帶豎線的分支符號2.2 └不帶豎線的分支符號2.3 ─橫線符號三、Windows系統中生成目錄樹一、├、└、─符號的背景 我們在編程中,可能會經常遇到一些特殊符號├、└、─。這并非偶然,二十由…

微軟XBOX游戲部門大裁員

近日有報道稱,微軟正計劃對Xbox游戲部門進行另外一次裁員,影響的將是整個團隊,而不是特定崗位或者部門,大概10%至20%的Xbox團隊成員受到影響,這是微軟這次對Xbox業務重組的一部分。 據報道,微軟已經開始新…

【關于Java 8 的新特性】

問:“Java 8 有啥新東西?” 你憋了半天,只說出一句:“嗯……有 Lambda 表達式。”別慌!Java 8 可不只是“語法糖”那么簡單。它是一次真正讓 Java 從“老派”走向“現代” 的大升級!一、Lambda 表達式&…

《嵌入式數據結構筆記(六):二叉樹》

1. ??樹數據結構的基本定義和屬性??樹是一種重要的非線性數據結構,用于表示層次關系。??基本定義??:樹是由 n(n ≥ 0)個結點組成的有限集合。當 n 0 時,稱為空樹;當 n > 0 時,樹必須…

sqlite的sql語法與技術架構研究

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 參考:參考提示詞與豆包AI交互輸出內容。 sqlite作為最常用的本地數據庫,其支持的sql語法也比較全面,歷經了二十多年經久不衰,其技術架構設計也是非常優秀的。 一&#xff1a…

Javascript中的一些常見設計模式

1. 單例模式(Singleton Pattern) 核心思想 一個類只能有一個實例,并提供一個全局訪問點。 場景 全局緩存Vuex / Redux 中的 store瀏覽器中的 localStorage 管理類 示例 const Singleton (function () {let instance;function createInstance…

2025 年最佳 AI 代理:工具、框架和平臺比較

目錄 什么是 AI Agents 應用 最佳 AI Agents:綜合列表 LangGraph AutoGen CrewAI OpenAI Agents SDK Google Agent Development Kit (ADK) 最佳no-code和open-source AI Agents Dify AutoGPT n8n Rasa BotPress 最佳預構建企業 AI agents Devin AI …

Linux 學習 ------Linux 入門(上)

Linux 是一種自由和開放源代碼的類 Unix 操作系統。它誕生于 1991 年,由芬蘭程序員林納斯?托瓦茲(Linus Torvalds)發起并開發。與 Windows 等閉源操作系統不同,Linux 的源代碼是公開的,任何人都可以查看、修改和傳播&…

[202403-E]春日

[202403-E]春日 題目背景 春水初至, 文筆亦似花開。 題目描述 坐看萬紫千紅, 提筆洋洋灑灑, 便成篇文章。 現在給你這篇文章, 這篇文章由若干個單詞組成, 沒有標點符號, 兩兩單詞之間由一個空格隔開。 為了…

Unity筆記(三)——父子關系、坐標轉換、Input、屏幕

寫在前面寫本系列的目的(自用)是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。這里只有部分語法知識。九、父子關系1、獲取、設置父對象(1)獲取父對象可以通過this.transform.parent獲取當前對象的父對象Trans…

基于Dubbo的高并發服務治理與流量控制實戰指南

基于Dubbo的高并發服務治理與流量控制實戰指南 在微服務架構的大規模應用場景中,如何保證服務在高并發壓力下的穩定與可用,是每位后端開發者必須面對的挑戰。本文結合實際生產環境經驗,分享基于Apache Dubbo的高并發服務治理與流量控制方案&a…

Mac 洪泛攻擊筆記總結補充

一、Mac 洪泛攻擊原理交換機依靠 MAC 地址表來實現數據幀的精準轉發,該表記錄著端口與相連主機 MAC 地址的對應關系。交換機具備自動學習機制,當收到一個數據幀時,會將幀中的源 MAC 地址與進入的端口號記錄到 MAC 表中。同時,由于…

路由器不能上網的解決過程

情況 前段時間,公司來人弄了一下網絡后,我的路由器就不能上網了,怎么回事啊。 先看看路由器的情況:看著網絡是有連接的:看這上面是能上網的,但是網都是上不去。 奇怪! 路由器介紹 路由器&#x…

Rancher 和 KubeSphere對比

以下是 Rancher 與 KubeSphere 的深度對比,涵蓋核心定位、架構設計、功能模塊、適用場景等關鍵維度,助您精準選型:一、核心定位與設計哲學維度RancherKubeSphere本質Kubernetes 多集群管理控制平面Kubernetes 全棧云原生操作系統目標簡化K8s集…

【深度學習新浪潮】TripoAI是一款什么樣的產品?

TripoAI是由硅谷AI初創公司VAST開發的多模態3D內容生成平臺,其核心技術基于數十億參數的3D基礎模型,專注于通過文本描述、單圖/多圖輸入或手繪涂鴉快速生成高精度可編輯的3D模型。以下是其核心信息: 一、技術架構與核心功能 秒級生成與多模態輸入 生成速度:僅需8秒即可生成…

二十八天(數據結構:圖的補充)

圖:是一種非線性結構形式化的描述: G{V,R}V:圖中各個頂點元素(如果這個圖代表的是地圖,這個頂點就是各個點的地址)R:關系集合,圖中頂點與頂點之間的關系(如果是地圖,這個關系集合可能就代表的是各個地點之間的距離)在頂點與頂點…

戶外廣告牌識別準確率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析,核心技術參數與架構設計引用自《陌訊技術白皮書》,禁止任何形式的轉載與抄襲。一、行業痛點:戶外廣告牌識別的三大技術瓶頸戶外廣告牌作為城市視覺符號的重要載體,其智能化識別在商業監測、合規監管等…

【vue組件通信】一文了解組件通信多種方式

前言 在 Vue 中,組件通信有多種方式,適用于不同場景(父子組件、兄弟組件、跨級組件等)。以下是完整的組件傳值方法總結,僅供概覽參考:一、父子組件通信 1. Props(父 → 子) 父組件通…

項目一系列-第3章 若依框架入門

第3章 若依框架入門 3.1 若依框架概述 為什么要基于若依框架開發? 快速開發:能快速搭建一個應用框架,減少工作量。可定制化:提供豐富插件和拓展點,滿足不同項目的特定需求。簡化開發流程:框架提供常用的功能…

WSL安裝MuJoco報錯——FatalError: gladLoadGL error

文章目錄WSL中配置MuJoCo報錯 FatalError: gladLoadGL error 的終極解決方案🔍 問題原因分析? 解決方案:切換至 EGL 渲染后端第一步:安裝系統級依賴庫第二步:使用 Conda 安裝兼容的圖形庫第三步:設置環境變量以啟用 E…