JavaSE-多態

多態的概念

? ? ? ? 在完成某個行為時,不同的對象在完成時會呈現出不同的狀態。

比如:動物都會吃飯,而貓和狗都是動物,貓在完成吃飯行為時吃貓糧,狗在完成吃飯行為時吃狗糧,貓和狗都會叫,狗在完成這個行為時會狗叫,而哈基米會哈氣。

在編程中,多態是指利用子類繼承父類的特性在使用對象時達到簡化代碼的目的。

多態的實現條件

在java中要實現多態,必須要滿足如下幾個條件,缺一不可:
1. 必須在繼承體系下
2. 子類必須要對父類中方法進行重寫
3. 通過父類的引用調用重寫的方法
多態體現:在代碼運行時,當傳遞不同類對象時,會調用對應類中的方法。

下面是簡單的示例:

public class Animal {public String name;public int age;public Animal(String name,int age) {this.name = name;this.age = age;}public void cry(){System.out.println(name+"正在叫---");}}public class Dog extends Animal{public Dog(String name,int age){super(name,age);}public void cry(){System.out.println(name+"正在狗叫---");}
}ublic class Cat extends Animal{public Cat(String name,int age){super(name,age);}public void cry(){System.out.println(name+"正在哈氣---");}
}public class test {public static void main(String[] args) {Animal dog = new Dog("富貴",3);Animal cat = new Cat("哈吉米",4);dog.cry();cat.cry();}
}

運行結果:

在父類Animal和子類Dog與Cat中都有名為cry的方法,我們可以發現在主方法實例化子類后調用的cry均為子類本身的方法,這種現象就稱之為多態。?

重寫

重寫(override):也稱為覆蓋。重寫是子類對父類非靜態、非private修飾,非?nal修飾,非構造方法等的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!重寫的好處在于子類可以根據需要,定義特定于自己的行為。 也就是說子類能夠根據需要實現父類的方法。

【方法重寫的規則】
1.子類在重寫父類的方法時,一般必須與父類方法原型一致: 返回值類型 方法名 (參數列表) 要完全一致
2.被重寫的方法返回值類型可以不同,但是必須是具有父子關系的
3.訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類方法被public修飾,則子類中重寫該方法就不能聲明為 protected
4.父類被static、private修飾的方法、構造方法都不能被重寫。
5.重寫的方法, 在編譯器中使用 @Override 注解來顯式指定. 有了這個注解能幫我們進行一些合法性校驗. 例如不小心將方法名字拼寫錯了 (比如寫成 aet), 那么此時編譯器就會發現父類中沒有 aet 方法, 就會編譯報錯, 提示無法構成重寫。

方法的重寫與重載的區別:

在重寫中,兩個方法的參數列表必須相同,返回類型必須相同或者構成父子關系,訪問權限限定符必須相同或者更寬松,而在重載中,參數列表必須不同才能構成重載,返回類型可以隨意修改,訪問權限限定符可以隨意修改。?

靜態綁定:也稱為前期綁定(早綁定),即在編譯時,根據用戶所傳遞實參類型就確定了具體調用那個方法。典型代表函數重載。
動態綁定:也稱為后期綁定(晚綁定),即在編譯時,不能確定方法的行為,需要等到程序運行時,才能夠確定具體調用那個類的方法,典型代表函數重寫。

兩種轉型

向上轉型

概念;創建一個子類對象,將其作為父類對象來使用。

語法格式:父類類型?對象名 = new 子類類型();

?

由于父類包含子類,父類是大范圍,子類是小范圍,所以這種轉型就是一種父類對子類的引用。

?向上轉型的使用場景:

1.直接賦值

Animal dog = new Dog("富貴",3);

將子類直接賦值給父類。?

2.方法傳參

public void AnimalCry(Animal a){a.cry();}

在方法的參數列表中使用父類Animal聲明,在傳參時就可以傳入子類Cat和Dog。?

3.方法返回值

public Animal buyAnimal(int a){if(a==1){return new Cat("貓貓",1);}else if(a==2){return new Dog("狗狗",1);}else{return null;}}

示例:

public class test {public static void animalCry(Animal a){a.cry();}public static Animal buyAnimal(int a){if(a==1){return new Cat("貓貓",1);}else if(a==2){return new Dog("狗狗",1);}else{return null;}}public static void main(String[] args) {Animal dog = new Dog("富貴",3);Animal cat = new Cat("哈吉米",4);animalCry(dog);animalCry(cat);Animal sweet = buyAnimal(1);sweet.cry();sweet = buyAnimal(2);sweet.cry();}
}

在主方法中,我們首先實例化Dog和Cat,然后將兩個子類對象傳參給animalCry,然后用sweet接受buyAnimal返回的子類對象。這里就使用到了三種向上轉型的場景。

向上轉型的優點:使代碼更加方便簡潔。

向上轉型的缺點:不能使用子類特有的方法。

向下轉型

將一個子類對象向上轉型為父類對象后,無法在使用子類特有的方法,此時需要用到向下轉型。

public class Animal {public String name;public int age;public Animal(String name,int age) {this.name = name;this.age = age;}public void cry(){System.out.println(name+"正在叫---");}}public class Dog extends Animal{public Dog(String name,int age){super(name,age);}public void cry(){System.out.println(name+"正在狗叫---");}public void eatBone(){System.out.println(name+"正在啃骨頭---");}
}public class Cat extends Animal{public Cat(String name,int age){super(name,age);}public void cry(){System.out.println(name+"正在哈氣---");}public void eatFish(){System.out.println(name+"正在吃魚---");}
}public class test {public static void main(String[] args) {Dog dog = new Dog("富貴",3);Cat cat = new Cat("哈吉米",4);//向上轉型Animal animal =cat;animal.cry();animal=dog;animal.cry();animal.eatBone();//這里編譯器會將animal作為Animal對象處理//而Animal類中沒有eatBone方法//所以會編譯報錯cat = (Cat)animal;cat.eatFish();//這里對animal進行強制類型轉換為cat//但是animal在向上轉換之前指向的實際是dog//所以這里在運行時會出現異常dog=(Dog)animal;dog.eatBone();}
}

刪除錯誤代碼后的運行結果:

為了確保向下轉型時的安全性,Java引入了instanceof關鍵字

當(a instanceof b )為真時,代表a為b類實例化的對象,以此判斷a的類型。?

多態的優缺點

優點

假設有如下父類和子類:

class Shape {public void draw() {System.out.println("畫圖形!");}}
class Rect extends Shape{public void draw() {System.out.println("?");}
}
class Cycle extends Shape{public void draw() {System.out.println("●");}
}
class Flower extends Shape{public void draw() {System.out.println("?");}
}

如果我們不使用多態思想,那么需要這樣打印這些圖形:

public static void drawShapes() {Rect rect = new Rect();Cycle cycle = new Cycle();Flower flower = new Flower();String[] shapes = {"cycle", "rect", "cycle", "rect", "?ower"};for (String shape : shapes) {if (shape.equals("cycle")) {cycle.draw();} else if (shape.equals("rect")) {rect.draw();} else if (shape.equals("?ower")) {flower.draw();}}}

使用多態思想:

public static void drawShapes() {// 我們創建了一個 Shape 對象的數組.Shape[] shapes = {new Cycle(), new Rect(), new Cycle(), new Rect(), new Flower()};for (Shape shape : shapes) {shape.draw();}}

兩種方法輸出相同,代碼量卻相去甚遠:

我們可以看出多態思想為我們省去了許多if-else分支,降低了代碼的圈復雜度?,這就是多態的第一個優點。

多態的第二個優點時可擴展性強,如果新增一種形狀,使用多態的方法改動也更加簡潔:

class Triangle extends Shape {public void draw() {System.out.println("△");}
}

缺點

1. 屬性沒有多態性
當父類和子類都有同名屬性的時候,通過父類引用,只能引用父類自己的成員屬性
2. 構造方法沒有多態性

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

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

相關文章

TDengine 使用最佳實踐(2)

TDengine 使用最佳實踐(1) 安裝部署 目錄規劃 軟件安裝 參數配置 時鐘同步 驗證環境 集群部署 寫入查詢 連接方式 數據寫入 數據查詢 運維巡檢 運維規范 數據庫啟停 狀態檢查 運維技巧 日常巡檢 數據庫升級 故障排查 故障定位 日志調試 故障反饋 關于 T…

如何通過公網IP訪問部署在kubernetes中的服務?

背景說明我們有些私有化部署的項目,使用k8s來承載服務,通過ingress-nginx轉發外部的請求到集群。有時候業主的域名沒有申請下來,我們會配置臨時的域名,測試同事配置主機hosts來完成功能驗證,等功能驗證完畢后&#xff…

Datawhale AI 夏令營2025科大訊飛AI大賽<夏令營:用AI做帶貨視頻評論分析>

賽題題目 任務一:商品識別 基于視頻內容識別對應的商品 【情感分析】對評論文本進行多維度情感分析,涵蓋維度見數據說明; 任務二(文本分類):從非結構化評論中提取情感傾向 評論聚類】按商品對歸屬指定維度的…

AI 時代的分布式多模態數據處理實踐:我的 ODPS 實踐之旅、思考與展望

AI 時代的分布式多模態數據處理實踐:我的 ODPS 實踐之旅、思考與展望 🌟嗨,我是LucianaiB! 🌍 總有人間一兩風,填我十萬八千夢。 🚀 路漫漫其修遠兮,吾將上下而求索。 目錄 1. 什…

硬件工程師筆試面試高頻考點匯總——(2025版)

目錄 1 電子器件部分 1.1 電阻 1.1.1 電阻選型時一般從哪幾個方面進行考慮? 1.1.2 上拉下拉電阻的作用 1.1.3 PTC熱敏電阻作為電源電路保險絲的工作原理 1.1.4 如果阻抗不匹配,有哪些后果 1.1.5 電阻、電容和電感0402、0603和0805封裝的含義 1.1.6 電阻、電…

華為HarmonyOS 5.0深度解析:跨設備算力池技術白皮書(2025全場景智慧中樞)

??摘要??HarmonyOS 5.0的??跨設備算力池技術??正在重構終端計算范式。本文首次系統性拆解其技術內核:通過??異構硬件資源虛擬化??、??任務流圖調度引擎??、??確定性時延網絡??三大支柱,實現手機、汽車、智慧屏等設備的算力動態聚合與…

ASP.NET Core 中的延遲注入:原理與實踐

在軟件開發中,依賴注入已成為構建可維護、可測試和可擴展應用程序的核心模式。ASP.NET Core 內置的依賴注入容器為我們管理服務生命周期提供了極大的便利。然而在某些特定場景下,我們可能不希望某個依賴項在宿主對象被創建時立即實例化,而是希…

PHP內存溢出問題的深度分析與系統解決方案

文章目錄一、問題本質:什么是PHP內存溢出?內存管理核心原理二、高頻內存溢出場景深度解析場景1:大數據集不當處理場景2:無限遞歸陷阱場景3:實體關系映射(ORM)的N1問題場景4:未及時釋…

常見 HTTP 方法的成功狀態碼200,204,202,201

HTTP 協議中,操作成功后的狀態碼選擇取決于操作類型和響應內容,并非所有非 GET/POST 請求都返回 204。以下是常見 HTTP 方法的成功狀態碼規范:1. GET200 OK:默認成功狀態碼,表示請求成功且返回了資源內容。206 Partial…

【論文閱讀】Think Only When You Need with Large Hybrid-Reasoning Models

Think Only When You Need with Large Hybrid-Reasoning Models2 Large Hybrid-Reasoning Models2.1 Problem Formulation關鍵定義與目標核心挑戰與解決方案2.2 第一階段:混合微調(Hybrid Fine-Tuning, HFT)核心設計數據構建數據集統計優化目…

洛谷 P13014:[GESP202506 五級] 最大公因數

【題目來源】 https://www.luogu.com.cn/problem/P13014 【題目描述】 對于兩個正整數 ,他們的最大公因數記為 。對于 個正整數 ,他們的最大公因數為: 給定 個正整數 以及 組詢問。對于第 組詢問,請求出 的最大公因數&…

構建應用內智能:衡石嵌入式BI如何打造“指標中臺”驅動的場景化分析

在當今數據驅動的業務環境中,將智能分析能力深度嵌入業務應用(如CRM、ERP、SCM、自研SaaS)已成為剛需。然而,實現高性能、一致性、可治理的嵌入式分析面臨巨大技術挑戰。衡石科技通過其核心的指標中臺(Metric Platform…

帶貨視頻評論洞察 Baseline 學習筆記 (Datawhale Al夏令營)

一、 項目認識背景:電商直播/短視頻已積累大量「視頻 評論」數據,蘊含了消費者的真實反饋。目標:通過「商品識別 → 情感分析 → 評論聚類」三步,輔助品牌洞察、網紅投放評估。二、 Baseline 代碼流程1. 讀取和預處理video_data …

uniapp中使用uView-plus踩坑記錄

???1.使用插件市場安裝點擊到插件市場 零云uview-plus3.0重磅發布,全面的Vue3鴻蒙移動組件庫。 - DCloud 插件市場 點擊選擇項目直接導入就可以,下載完成后會在uni_modules中,這個.gitignore中不可忽略 ? 使用在main.js里引入 import…

openGauss數據庫管理實戰指南——基本常用操作總結

查看所有數據庫 查看所有表 \d 查看函數定義 查看所有用戶 select usename from pg_user; 1.數據庫創建管理 CREATE DATABASE test; 2.數據庫用戶創建管理 CREATE USER tom PASSWORD Root123456.; 3.表的創建及管理 3.1.創建表 CREATE TABLE test(ID INTEGER PRIMARY …

智慧公安信息化建設解決方案PPT(63頁)

智慧公安的定義與職能 智慧公安是利用現代信息技術提升公安工作效率與服務質量的新模式,涵蓋刑事偵查、治安管理、交通管理等多方面職能,致力于保障社會安全與秩序。 智慧公安信息化建設的重要性 信息化建設是智慧公安發展的核心,通過數據…

k8s存儲入門

目錄 一、 Volume 的概念 二、 Volume 的類型 三、 通過 emptyDir 共享數據 1. EmptyDir 特性 2. EmptyDir 共享數據 四:使用 HostPath 掛載宿主機文件 1. HostPath 特性 2. 掛載宿主機時區文件 五、 掛載 NFS 至容器 1. 前置準備(所有 K8s 節…

基于 Flutter 的開源文本 TTS 朗讀器(支持 Windows/macOS/Android)

界面特性 基于 Flutter 的文本 TTS 朗讀器支持 Windows、macOS、AndroidTTS 源:OpenAI TTS、Microsoft TTS支持設置代理支持設置應用主題支持倍速支持書簽支持點擊指定地方朗讀支持 txt、epub、貼粘文本支持從上次地方開始朗讀 源代碼https://github.com/xchenhao/t…

深入理解大語言模型:從核心技術到極簡實現

零基礎的讀者建議先看《零基礎理解大語言模型:從生活例子到代碼實現》,本教程的完整代碼可以在GitHub上找到,如果你有任何問題或建議,歡迎交流討論。 引言 自ChatGPT橫空出世以來,大語言模型(Large Langua…

7月13日日記

看來每天寫一篇日記對我來說還是一個不小的挑戰。主要是和惰性做抗爭吧。但是這個東西說實話也沒有什么難度,也并不占用時間,一篇日記大概十幾分鐘就可以寫完。可能更多的是健忘。忘了每天有一個這樣的小任務。忘了前幾天日記寫沒寫了,三下鄉…