Java中多態的一些簡單理解

什么是多態
1.面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最后一個概念,也是最重要的知識點。
2.多態的定義:指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而采用多種不同的行為方式。(發送消息就是函數調用)
3.實現多態的技術稱為:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
4.多態的作用:消除類型之間的耦合關系。
5.現實中,關于多態的例子不勝枚舉。
下面是多態存在的三個必要條件,要求大家做夢時都能背出來!
多態存在的三個必要條件
一、要有繼承;
二、要有重寫;
三、父類引用指向子類對象。多態的好處:
1.可替換性(substitutability)。多態對已存在代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。
2.可擴充性(extensibility)。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。
實際上新加子類更容易獲得多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。
3.接口性(interface-ability)。多態是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。
4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。
5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。
Java中多態的實現方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。
1.Java中除了static和final方法外,其他所有的方法都是運行時綁定的。private方法都被隱式指定為final的,因此final的方法不會在運行時綁定。
當在派生類中重寫基類中static、final、或private方法時,實質上是創建了一個新的方法。
2.在派生類中,對于基類中的private方法,最好采用不同的名字。
3.包含抽象方法的類叫做抽象類。注意定義里面包含這樣的意思,只要類中包含一個抽象方法,該類就是抽象類。抽象類在派生中就是作為基類的角色,為不同的子類提供通用的接口。
4.對象清理的順序和創建的順序相反,當然前提是自己想手動清理對象,因為大家都知道Java垃圾回收器。
5.在基類的構造方法中小心調用基類中被重寫的方法,這里涉及到對象初始化順序。
6.構造方法是被隱式聲明為static方法。
7.用繼承表達行為間的差異,用字段表達狀態上的變化。
在JAVA中有兩種多態是指:運行時多態和編譯時多態。
關于類的多態性簡介如下:
多態性是面向對象的核心特征之一,類的多態性提供類中成員設計的靈活性和方法執行的多樣性.
1、類多態性表現
(1)方法重載
重載表現為同一個類中方法的多態性.一個類生命多個重載方法就是為一種功能提供多種實現.編譯時,根據方法實際參數的數據類型\個數和次序,決定究竟應該執行重載方法中的哪一個.
(2)子類重定義從父類繼承來的成員
當子類從父類繼承來的成員不適合子類時,子類不能刪除它們,但可以重定義它們,使弗雷成員適應子類的新需求.子類重定義父類成員,同名成員在父類與子類之間表現出多態性,
父類對象引用父類成員,子類對象引用子類成員,不會產生沖突和混亂.
子類可重定義父類的同名成員變量,稱子類隱藏父類成員變量.子類也可以重定義父類的同名成員方法,當子類方法的參數列表與父類方法參數列表完全相同時,
稱為子類方法覆蓋(override)父類方法。覆蓋父類方法時,子類方法的訪問權限不能小于父類方法的權限。
由于Object類的equals()方法比較兩個對象的引用是否相等而不是值是否相等,因此一個類要覆蓋Object類的equals()方法,提供本類兩個對象比較相等方法.
覆蓋表現為父類與子類之間方法的多態性.java 尋找執行方法的原則是:從對象所屬的類開始,尋找匹配的方法執行,如果當前類中沒有匹配的方法,
則逐層向上依次在父類或祖先類中尋找匹配方法,直到Object類.
2、super 引用
在子類的成員方法中,可以使用代詞super引用父類成員.super引用的語法如下:
super([參數列表]) //在子類的構造方法體中,調用父類的構造方法
super.成員變量 //當子類隱藏父類成員變量時,引用父類同名成員變量
super.成員方法([參數列表]) //當子類覆蓋父類成員方法時,調用父類同名成員方法
*注意:super引用沒有單獨使用的語法
3、多態性有兩種:
1)編譯時多態性
對于多個同名方法,如果在編譯時能夠確定執行同名方法中的哪一個,則稱為編譯時多態性.
2)運行時多態性
如果在編譯時不能確定,只能在運行時才能確定執行多個同名方法中的哪一個,則稱為運行時多態性
方法覆蓋表現出兩種多態性,當對象獲得本類實例時,為編譯時多態性,否則為運行時多態性,例如:
XXXX x1 = new XXXX(參數列表); //對象獲得本類實例,對象與其引用的實例類型一致
XXX xx1 = new XXX(參數列表);
x1.toString(); //編譯時多態性,執行XXX類的方法.
xx1.toString(); //編譯時多態性,執行XXXX類覆蓋的方法.
XXXX為XXX的父類.
由于子類對象既是父類對象,父類對象與子類對象之間具有賦值相容性,父類對象能夠被賦值為子類對象.例如,
XXXX x2 = new XXX(參數列表); //父類對象獲得子類實例,子類對象即是父類對象
x2.toString(); //運行時多態
x2聲明為父類對象卻獲得子類XXX的實例,那么x2.toString()究竟執行父類方法還是執行子類覆蓋的方法呢?
這分為兩種情況:
取決于子類是否覆蓋父類方法.如果子類覆蓋父類方法,則執行子類方法;
如果沒有覆蓋,則執行父類方法.
在編譯時,僅僅依據對象所屬的類,系統無法確定到底應該執行那個類的方法,只有運行時才能確定,因此這是運行時多態.
父類對象并不能執行所有的子類方法,只能執行那些父類中聲明\子類覆蓋的子類方法.
在這樣一個體系中,多態表現出多種形式的能力。通用多態引用有相同結構類型的大量對象,他們有著共同的特征。特定的多態涉及的是小部分沒有相同特征的對象。
四種多態可做以下描述:強制的:一種隱式做類型轉換的方法。重載的:將一個標志符用作多個意義。參數的:為不同類型的參數提供相同的操作。包含的:類包含關系的抽象操作。
我將在講述子類型多態前簡單介紹一下這幾種多態。強制的多態強制多態隱式的將參數按某種方法,轉換成編譯器認為正確的類型以避免錯誤。在以下的表達式中,編譯器必須決定二元運算符‘+’所應做的工作:2.0 + 2.02.0 + 22.0 + "2"
第一個表達式將兩個double的操作數相加;Java中特別聲明了這種用法。
第二個表達式將double型和int相加。Java中沒有明確定義這種運算。不過,編譯器隱式的將第二個操作數轉換為double型,并作double型的加法。
做對程序員來說十分方便,否則將會拋出一個編譯錯誤,或者強制程序員顯式的將int轉換為double。
第三個表達式將double與一個String相加。Java中同樣沒有定義這樣的操作。所以,編譯器將double轉換成String類型,并將他們做串聯。
強制多態也會發生在方法調用中。假設類Derived繼承了類Base,類C有一個方法,原型為m(Base),在下面的代碼中,編譯器隱式的將 Derived類的對象derived轉化為Base類的對象。
這種隱式的轉換使m(Base)方法使用所有能轉換成Base類的所有參數。
C c = new C();
Derived derived = new Derived();
c.m( derived );
并且,隱式的強制轉換,可以避免類型轉換的麻煩,減少編譯錯誤。當然,編譯器仍然會優先驗證符合定義的對象類型。
重載的多態重載允許用相同的運算符或方法,去表示截然不同的意義。‘+’在上面的程序中有兩個意思:兩個double型的數相加;兩個串相連。另外還有整型相加, 長整型,等等。這些運算符的重載,依賴于編譯器根據上下文做出的選擇。以往的編譯器會把操作數隱式轉換為完全符合操作符的類型。雖然Java明確支持重 載,但不支持用戶定義的操作符重載。Java支持用戶定義的函數重載。一個類中可以有相同名字的方法,這些方法可以有不同的意義。這些重載的方法中,必須滿足參數數目不同,相同位置上的參數類型不同。這些不同可以幫助編譯器區分不同版本的方法。編譯器以這種唯一表示的特征來表示不同的方法,比用名字表示更為有效。據此,所有的多態行為都能編譯通過。強制和重載的多態都被分類為特定的多態,因為這些多態都是在特定的意義上的。這些被劃入多態的特性給程序員帶來了很大的方便。強制多態排除了麻煩的類型和編譯錯誤。重載多態像一塊糖,允許程序員用相同的名字表示不同的方法,很方便。
參數的多態參數多態允許把許多類型抽象成單一的表示。例如,List抽象類中,描述了一組具有同樣特征的對象,提供了一個通用的模板。你可以通過指定一種類型以重 用這個抽象類。這些參數可以是任何用戶定義的類型,大量的用戶可以使用這個抽象類,因此參數多態毫無疑問的成為最強大的多態。
包含的多態包含多態通過值的類型和集合的包含關系實現了多態的行為.在包括Java在內的眾多面向對象語言中,包含關系是子類

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

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

相關文章

Linux用戶和權限

一、認知root用戶 1.1 了解什么是root用戶(超級管理員) root用戶(超級管理員) 無論是Windows、MacOS、Linux均采用多用戶的管理模式進行權限管理。 在Linux系統中,擁有最大權限的賬戶名為:root&#x…

Java9及之后關于類加載器的新特性

為了保證兼容性,JDK9沒有從根本上改變三層類加載器的架構和雙親委派模型,但為了模塊化系統的順利運行,仍然發生了一些值得被注意的變動。 一、變動1 由于引入了模塊化概念,所以不同的類加載器回去加載屬于不同模塊的類 啟動類加…

Nginx負載均衡實戰

🎵負載均衡組件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模塊允許Nginx定義一組或多組節點服務器組,使用時可以通過多種方式去定義服務器組 樣例: upstream backend {server back…

從零開發短視頻電商 在AWS SageMaker已創建的模型列表中進行部署

1.導航到 SageMaker 控制臺。 2.在 SageMaker 控制臺的左側導航欄中,選擇 “模型” 選項。 3.在模型列表中,找到您要部署的模型。選擇該模型。 4.點擊 “創建端點” 選項或者點擊 “創建端點配置” 選項都可以進行部署。 選擇創建端點進去后還是會進行…

k8s中部署基于nfs的StorageClass

部署nfs服務 1.1 創建基礎鏡像(選做) 如果以docker的形式部署nfs server, 參考此步驟, 若否, 該步驟可忽略。 mkdir /data/nfs -p chmod 755 /data/nfs# NFS默認端口: 111、2049、20048 docker run -d \ --privileged \ --name nfs_server \ -p 111:111/tcp \ -p 111:111/ud…

[CTFshow 紅包挑戰] 刷題記錄

文章目錄 紅包挑戰7紅包挑戰8紅包挑戰9 紅包挑戰7 考點&#xff1a;xdebug拓展 源碼 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd s…

1832_org-mode的注釋處理

Grey # :OPTIONS ^:nil org-mode的注釋處理 關于這部分其實比較簡單&#xff0c;在我現在的使用訴求上來說要求不多。但是我覺得如果考慮以后把文學式編程作為一種開發的主要體驗的話&#xff0c;掌握這樣的操作很有必要。因為我可以控制部分信息的輸出。 自然&#xff0c;控…

LeetCode-數組-重疊、合并、覆蓋問題-中等難度

435. 無重疊區間 我認為區間類的題型&#xff0c;大多數考驗的是思維能力&#xff0c;以及編碼能力&#xff0c;該類題型本身并無什么算法可言&#xff0c;主要是思維邏輯&#xff0c;比如本題實際上你只需要能夠總結出重疊與不重疊的含義&#xff0c;再加上一點編碼技巧&#…

go-zero開發入門-API服務開發示例

接口定義 定義 API 接口文件 接口文件 add.api 的內容如下&#xff1a; syntax "v1"info (title: "API 接口文件示例"desc: "演示如何編寫 API 接口文件"author: "一見"date: "2023年12月07日"version: "…

Spring Boot 優雅地處理重復請求

前 言 對于一些用戶請求&#xff0c;在某些情況下是可能重復發送的&#xff0c;如果是查詢類操作并無大礙&#xff0c;但其中有些是涉及寫入操作的&#xff0c;一旦重復了&#xff0c;可能會導致很嚴重的后果&#xff0c;例如交易的接口如果重復請求可能會重復下單。 重復的場…

Verilog基礎:$random系統函數的使用

相關閱讀 Verilog基礎?編輯https://blog.csdn.net/weixin_45791458/category_12263729.html $random系統函數語法的BNF范式如下所示&#xff0c;有關BNF范式相關內容&#xff0c;可以瀏覽以往文章Verilog基礎&#xff1a;巴科斯范式(BNF)。 $random系統函數在每次調用時返回一…

【IDEA】IntelliJ IDEA中進行Git版本控制

本篇文章主要記錄一下自己在IntelliJ IDEA上使用git的操作&#xff0c;一個新項目如何使用git進行版本控制。文章使用的IDEA版本 IntelliJ IDEA Community Edition 2023.3&#xff0c;遠程倉庫為https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Git…

[gRPC實現go調用go]

1什么是RPC RPC&#xff1a;Remote Procedure Call&#xff0c;遠程過程調用。簡單來說就是兩個進程之間的數據交互。正常服務端的接口服務是提供給用戶端(在Web開發中就是瀏覽器)或者自身調用的&#xff0c;也就是本地過程調用。和本地過程調用相對的就是&#xff1a;假如兩個…

深度優先遍歷(DFS)

時間復雜度與深搜一致&#xff1b;

STM32 定時器總結

縮寫 ARR: Auto-Reload Register&#xff08;保存定時器的計數范圍&#xff09; PSC: Prescaler register&#xff08;預分頻器寄存器&#xff0c;根據設置的分頻因子N&#xff0c;計數N個定時器時鐘脈沖后&#xff0c;產生一個CNT計數&#xff0c;以此實現分頻功能&#xff0…

LeetCode 2048. 下一個更大的數值平衡數

一、題目 1、題目描述 如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數。 0 < n < 1e6 2、接口描述 public:int nextB…

Android渲染-AHardwareBuffer

本文主要從應用的角度介紹android的native層AHardwareBuffer創建紋理以及保存渲染數據。 HardwareBuffer 要介紹native層的AHardwareBuffer&#xff0c;就需要先從Java層的HardwareBuffer說起。Android官方對于HardwareBuffer介紹如下&#xff1a; HardwareBuffer wraps a na…

HttpURLConnection OOM問題記錄

使用HttpURLConnection 上傳大文件&#xff0c;會出現內存溢出問題&#xff1a; 觀察HttpURLConnection 源碼&#xff1a; Overridepublic synchronized OutputStream getOutputStream() throws IOException {connecting true;SocketPermission p URLtoSocketPermission(th…

【接口分享】熱門好用的API,含免費次數

語音驗證碼短信&#xff1a;撥打電話告知用戶驗證碼&#xff0c;實現信息驗證。短信驗證碼&#xff1a;可用于登錄、注冊、找回密碼、支付認證等等應用場景。支持三大運營商&#xff0c;3秒可達&#xff0c;99.99&#xff05;到達率&#xff0c;支持大容量高并發。通知短信&…

基于SSM的點餐系統的設計與實現

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#xff1a;是 目錄…