面向對象------多態

1.多態的定義

通俗來說,當同一種行為或者事情發生在不同的對象上,這些行為或者事情最終得到的結果不同

注意:多態要發生在繼承的基礎上。

例如:彩色打印機和黑白打印機。

彩色打印機和黑白打印機是不同的對象,但打印(行為)這件事分別發生在它們身上的時候,彩色打印機打印的是彩色的,而黑白打印機最終打印的結果卻是黑白色的。

9d2c6dfbc7b140c69b09ee67f3d2d610.jpeg

對應到Java中就是相同的方法對應到不同的對象中有不同的結果。

?2.多態的使用

2.1 向上轉型

向上轉型發生在繼承的基礎上,所謂向上轉型,就是由子類類型向父類類型轉換。向上轉型的方式由3中,分別為:直接賦值、方法的傳參和方法的返回值形式。

cd27b6ff42c54f478357c0f945739ffd.png

1.直接傳參

class Animal{}
class Dog extends Animal{}
public class Test {public static void main(String[] args) {//直接賦值,發生向上轉型Animal animal=new Dog();}
}

2. 方法的傳參

class Animal{}
class Dog extends Animal{}
public class Test {public static void func(Animal animal){}public static void main(String[] args) {Dog dog=new Dog();//方法的傳參實現向上轉型func(dog);}
}

3.方法的返回值

class Animal{}
class Dog extends Animal{}
public class Test {public static Animal func(){Dog dog=new Dog();return dog;}public static void main(String[] args) {Animal animal=func();   }
}

4 向上轉型的缺點

當我們進行了向上轉型,我們就不能通過父類的引用(轉型之后的引用)去訪問子類特有的屬性或者方法。?

class Dog extends Animal{public Dog(String name,int age){super(name, age);}public void bark(){System.out.println(this.name+"在汪汪叫");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺財",18);animal.bark();}
}

運行以上代碼會報錯

3a35aad63445466885f9c1362e88f5fe.png

?2.2 動態綁定

動態綁定是理解多態的基礎。

?1.方法的重寫

當子類和父類中有一個方法名字一樣,參數列表一樣和返回值類型一樣,但是方法內不得具體實現不一樣,則子類對應的方法構成了方法的重寫。

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //編譯器中方法重寫的默認注釋public void eat() {System.out.println(this.name+"在吃狗糧");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃飯");}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺財",18);}
}

576d89fe0853486e98df4213b8c9be63.png

如上圖,紅框框里面就是構成重寫的部分。

2.方法重寫的注意事項

1.重寫的方法不能是一個靜態的方法(被static修飾的方法)。

28c19be6474e4253a98792d78ccb6458.png

2.被final修飾的方法無法被重寫

f62da0c70ea540acabba5dd3c82d2a38.png

3.如果子類重寫父類的方法時,子類重寫方法時的訪問權限要大于等于父類方法的權限。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 訪問權限大小比較
? ? ? ? ? ? ? ? ? ? ? ? ? public>protected>default>private

bb77810d585141edb5bb2f574fc883d7.png

如圖,因為父類要被重寫的方法得訪問權限為public,而子類中重寫的方法的訪問權限為private,所以運行代碼時,編譯器會報錯。

4.父類中被private修飾的方法無法被重寫

1b6abd7d39a849839ceeb30887da433e.png

5.重寫的方法的返回值類型可以不相同,但是返回值類型必須構成父子類的關系。

b86f870320124880b8e861f5bc099294.png

? ? ? ? ? ? ? ? ? ? ? ? ?

3. 方法的重寫和重載的區別

? ? ? ? ? ? ? ? ? ? ? ? ?重載? ? ? ? ? ? ? ? ? ? ? 重寫
? ?參數列表中的數據類型,順序和個priv數可以不一樣?參數列表中的數據類型,順序和個數必須一樣
? ?返回值的類型不一樣? 返回值類型必須一樣
? ?方法名必須一樣? ?方法名必須一樣

4.動態綁定

當運行代碼時,我們通過父類的引用去調用在子類和父類中重寫的方法,結果實際調用了子類的方法,這種情況就被稱為動態綁定。

?代碼演示

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //編譯器中方法重寫的默認注釋public void eat() {System.out.println(this.name+"在吃狗糧");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃飯");}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺財",18);animal.eat();}
}

運行代碼

3131275c2b1940e5a641801a54ebc4f8.png

通過上面代碼,我們發現,當我們完成了向上轉型之后,我們通過父類的引用去調用重寫的方法時,程序在編譯時,調用的確實是父類的eat( )方法。但是由于動態綁定,最終我們看到的是Dog類中的eat( )方法。

?2.3 向下轉型

向下轉型也是發生在繼承的繼承的基礎上,向下轉型就是父類向子類轉換。

019109a214b24964aa6670dc6a75a062.png

?1.向下轉型的優點

通過向下轉型,我們就可以訪問子類中特有的屬性和方法。

代碼演示

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //編譯器中方法重寫的默認注釋public void eat() {System.out.println(this.name+"在吃狗糧");}public void run(){System.out.println(this.name+"會跑");}
}
class Bird extends Animal{public Bird(String name, int age) {super(name, age);}public void eat(){System.out.println(this.name+"在吃鳥糧");}public void fly(){System.out.println(this.name+"會飛");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃飯");}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺財",18);Dog dog=(Dog)animal;//要強轉類型dog.run();//Dog類中特有的方法System.out.println("=======");Animal animal2=new Bird("小鳥",12);Bird bird=(Bird) animal2;//要強轉類型bird.fly();//Bird類中特有的方法}
}

運行代碼?

21281240949c45d1bad4775eb2eb84a9.png

2.向下轉型的缺點

并不是所有的向下轉型都是成功的。

655dac7b18a94886b34688831f9dd55f.png

57860363b23b4fd29afafe3141b260cd.png

3.多態的使用

了解了向上轉型和多態之后,我們接著來在Java中來體驗多態。

代碼演示

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //編譯器中方法重寫的默認注釋public void eat() {System.out.println(this.name+"在吃狗糧");}
}
class Bird extends Animal{public Bird(String name, int age) {super(name, age);}public void eat(){System.out.println(this.name+"在吃鳥糧");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃飯");}
}
public class Test {public static void func(Animal animal){animal.eat();}public static void main(String[] args) {Dog dog=new Dog("旺財",18);func(dog);System.out.println("=======");Bird bird=new Bird("小鳥",12);func(bird);}
}

129db2974a1744508bc94abd0bc30893.png

1b615045c53a47a9b98a69f6bbfcd19e.png

我們都是通過animal這個引用去調用父類中的eat( )方法,但是由于eat( )對應的對象不同,就調用了各對應子類中的eat( ) 方法,最終導致了結果的不同。這就是多態在Java語言中的體現。?

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

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

相關文章

詳細分析Element中的MessageBox基本知識(附Demo)

目錄 前言1. 基本知識2. Demo2.1 確認框2.2 警告框2.3 對話框 3. this.$confirm 前言 詳細知識推薦閱讀:詳細分析Element Plus中的ElMessageBox彈窗用法(附Demo及模版) MessageBox則常用于Vue2 1. 基本知識 MessageBox 是 Element UI 提供…

Liunx學習隨筆

Linux學習隨筆 一.前期準備1.安裝Vmware Workstation軟件2.下載linux鏡像3.安裝操作系統 夕陽無限好,只是近黃昏,時隔一年,重新提筆 沒有比腳更遠的路,沒有比人更高的山 一.前期準備 1.安裝Vmware Workstation軟件 下載地址&am…

加載頁面 跳轉 新頁面 vue

通常,我們點頁面上的詳情,或者編輯,需要加載一個新的頁面出來。 vue中加載頁面的方法: 在父頁面中(通常是某個模塊目錄下的index.vue),先寫這行代碼: import AddEditForm from ./…

南京觀海微電子----升壓和降壓模塊電路解析

(一)升壓模塊 1. 如果是交流電壓升壓,那非常簡單,只要選擇變比合適的變壓器就行(1:3和1:4.17); 2. 如果是直流電壓升壓,從12v升到36v也很容易,可選擇用的開關穩壓器很多,例如 :Cs5171.Cs5172.Cs5173.Cs5174.Mc33063.…

SQLAlchemy備忘

orm備忘 upsert,存在及更新,不存在則插入 from sqlalchemy.dialects.mysql import insertinsert_stmt insert(FileModule).values(file_pathpar_dict.file, module_keypar_dict.module_key,module_namepar_dict.module_name, project_idpar_dict.proj…

【調和級數】100321. 優質數對的總數 II

本文涉及知識點 調和級數 質數、最大公約數、菲蜀定理 LeetCode100321. 優質數對的總數 II 給你兩個整數數組 nums1 和 nums2,長度分別為 n 和 m。同時給你一個正整數 k。 如果 nums1[i] 可以被 nums2[j] * k 整除,則稱數對 (i, j) 為 優質數對&#…

[Android]在后臺線程執行耗時操作,然后在主線程更新UI

1.Coroutines(官方推薦) Coroutines 提供了一種輕量級的線程管理方式,使得在后臺線程執行任務和在主線程更新 UI 變得簡單。以下是如何在 Kotlin 中使用 Coroutines 來處理耗時邏輯并更新 UI 的步驟: 添加 Coroutines 依賴: 首…

數據結構·一篇搞定隊列!

hello,大家好啊,肖恩又拖更了,你們聽我狡辯,前段時間有期中考試,so我就沒什么時間寫這個,在這給大家道個歉😭😭😭 我后面一定盡力不拖更 那么接下來,我們來看…

Greenplum使用hbase外部表

概述 GP可以通過pxf協議上的hbase外表功能, 在數據庫中創建外部表,映射hbase table,以直接在gp中訪問 hbase數據,方便將hbase的查詢結果集保留在gp中 hbase端準備 HBase基礎概念: ?HBase 列包含兩個組件&#xff1…

粒子輻照環境中相機鏡頭防護及LabVIEW圖像處理注意事項

在粒子輻照環境測試電路板性能的實驗中,需要對相機鏡頭進行有效防護,同時利用LabVIEW進行圖像識別和處理。本文將討論相機鏡頭防護的關鍵因素和LabVIEW處理過程中的注意事項,包括防輻射材料選擇、輻射屏蔽措施、散熱管理、空間布局及LabVIEW軟…

c++11:左值引用和右值引用《全家桶》

總結一下C11中涉及到左值引用和右值引用的場景。 1 左值引用和右值引用的區別 左值引用 定義:對左值的引用。目的是避免內存拷貝,類似c中的指針,兩個場景:函數傳參、函數返回值。 右值引用 定義:對右值的引用。兩個場景&#…

【機器學習-k近鄰算法-01】 | Scikit-Learn工具包進階指南:機器學習sklearn.neighbors模塊之k近鄰算法實戰

🎩 歡迎來到技術探索的奇幻世界👨?💻 📜 個人主頁:一倫明悅-CSDN博客 ?🏻 作者簡介: C軟件開發、Python機器學習愛好者 🗣? 互動與支持:💬評論 &…

騎行 - 新區永旺出發的環太湖路線

環過好幾次太湖,但對路線都沒太在意,都是跟著別人走的。這次自己制定一個路書,方便下次自己一個人環太湖時使用。 開始是使用高德地圖做路書,只能在PC上做。我用的是網頁版,每次選點太麻煩了。要輸入地址搜索&#xff…

開源博客項目Blog .NET Core源碼學習(27:App.Hosting項目結構分析-15)

本文學習并分析App.Hosting項目中后臺管理頁面的角色管理頁面。 ??角色管理頁面用于顯示、檢索、新建、編輯、刪除角色數據同時支持按角色分配菜單權限,以便按角色控制后臺管理頁面的菜單訪問權限。角色管理頁面附帶一新建及編輯頁面,以支撐新建和編輯…

電纜廠可視化:提升生產透明度與運營效率

圖撲電纜廠可視化系統通過實時監控和數據分析,提高生產過程的透明度和可控性,優化資源配置和質量管理,顯著提升運營效率和產品質量。

啟動SpringBoot項目及解決端口占用問題(指令版)

打包SpringBoot 項目 需要將 SpringBoot 項目進行打包。可以使用 Maven 的快捷工具,或者在項目的 pom.xml 文件所在目錄執行以下命令: mvn clean package部署注意 Windows系統下,按照以下方式在cmd窗口以管理員身份允許使用命令啟動spring…

Flutter 中的 StatefulBuilder 小部件:全面指南

Flutter 中的 StatefulBuilder 小部件:全面指南 在Flutter中,StatefulBuilder是一個高效的小部件,它根據給定的構建函數來構建widget,并在組件樹中只對需要重新構建的部分進行更新。這使得它在性能優化方面非常有用,特…

電子電器架構 - AUTOSAR ON THE AIR

電子電器架構 - AUTOSAR ON THE AIR 我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 屏蔽力是信息過載時代一個人的特殊競爭力,任何消耗你的人和事,多看一眼都是你的不對。非必要不費力證明自己…

Mybase長久破解

1、軟件下載好之后,找到文件mybase8.ini文件 2、使用記事本打開,通過 Ctrl F 輸入快速找到屬性設置FirstUseOn.UserLic.App,將等號后面的數值刪掉保存即可 3、使用防護中心–>自定義防護(記得開啟) 4、添加規則…

Golang文件操作

文章目錄 文件操作基本介紹普通的文件操作方式(os包)帶緩沖的文件操作方式(bufio包)文件拷貝操作(io包) 命令行參數基本介紹解析命令行參數(flag包) JSON基本介紹JSON序列化JSON反序…