Java 三大特性—多態

目錄

  • 1、多態的概念
  • 2、多態的條件
  • 3、向上轉型
    • 3.1 概念
    • 3.2 使用場景
  • 4、向下轉型
  • 5、多態的優缺點

1、多態的概念

多態,通俗來講就是多種形態,即對于同樣的行為,不同的對象去完成會產生不同的狀態。比如動物都會吃東西,小狗和小貓都是動物,但是小狗是吃狗糧,而小貓是吃貓糧。

在這里插入圖片描述

2、多態的條件

在 Java 中實現多態需要滿足下述條件,缺一不可:

  1. 必須在繼承體系下。
  2. 子類對基類的方法實現重寫(即方法原型相同,但實現體不同)。
  3. 通過基類的引用調用重寫的方法。

多態的體現:在代碼運行時,當傳遞不同類的對象時,會調用對應類中的方法。

舉例說明:Animal 類是父類,Dog 類和 Cat 類是子類,繼承自 Animal 類,同時 Dog 類和 Cat 類對 Animal 類的方法進行了重寫。

// 父類
public class Animal {protected String name;protected int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(name + "在吃飯");}public void bark(){System.out.println(name + "在大叫");}
}// Dog 類:繼承自 Animal 類
// 1. 在繼承體系中
public class Dog extends Animal{protected String color;public Dog(String name, int age, String color) {super(name, age);this.color = color;}// 2. 對父類方法進行重寫@Overridepublic void eat() {System.out.println(name + "在吃狗糧");}@Overridepublic void bark() {System.out.println(name + "汪汪汪~");}public void sleep(){System.out.println(name + "在睡覺");}
}// Cat 類:繼承自 Animal 類
// 1. 在繼承體系下
public class Cat extends Animal {protected String temper;public Cat(String name, int age, String temper) {super(name, age);this.temper = temper;}// 2. 對父類方法進行重寫@Overridepublic void eat() {System.out.println(name + "在吃貓糧");}@Overridepublic void bark() {System.out.println(name + "喵喵喵~");}public void drink(){System.out.println(name + "在喝水");}
}

根據上述類,利用 Animal 類的引用調用被重寫的方法從而實現多態。

public class Test {public static void method(Animal animal){// 3. 通過基類的引用調用被重寫的方法// 在 method() 方法中利用 Animal 對象的引用調用被重寫的方法// 在程序的編譯階段并不知道會調用哪個子類的對象所對應的方法// 只有在運行階段給 method() 方法傳參時才知道。animal.eat();animal.bark();}public static void main(String[] args) {Dog dog = new Dog("毛毛", 5, "白色");method(dog);Cat cat = new Cat("小七", 1, "乖巧");method(cat);}
}

運行結果:

在這里插入圖片描述
由上述代碼可知,雖然在 main 方法中調用的是同一個 method() 方法,但是運行的結果卻不同。這是因為 Animal 類是 Dog 類和 Cat 類的基類,基類可以引用不同子類的對象,因此傳遞給形參 animal的值會出現不同,當傳遞的是 Dog 類的對象時,會調用 Dog 類中的方法,當傳遞的是 Cat 類的對象時,會調用 Cat 類中的方法。
當程序員在編寫 method() 方法時并不知道也不關心形參 animal 指的是 Cat 類還是 Dog 類的對象,只有當代碼運行起來,實參傳遞給形參值的時候才知道。形參 animal 調用方法會有不同的表現,這種行為就稱作多態。

3、向上轉型

3.1 概念

向上轉型,實際上是創建一個子類對象,當作父類對象來使用。

Animal animal = new Dog(“毛毛”, 5, “白色”);

animal 是父類類型,可以引用子類對象,因為狗和貓都是動物,這是從小范圍到大范圍的轉換,是安全的。但是向上轉型之后,無法通過父類的引用調用子類新增的成員方法。

在這里插入圖片描述

3.2 使用場景

向上轉型有以下三種使用場景:

  1. 直接賦值:子類對象賦值給父類對象。
Animal animal = new Dog("毛毛", 5, "白色");
  1. 方法傳參:形參為父類型引用,可以接收任意子類的對象。
public class Test {// 將 Dog 類和 Cat 類對象的引用傳參給 Animal 類的引用public static void method(Animal animal){animal.eat();animal.bark();}public static void main(String[] args) {Dog dog = new Dog("毛毛", 5, "白色");method(dog);Cat cat = new Cat("小七", 1, "乖巧");method(cat);}
}
  1. 方法返回:方法返回類型是父類類型,可以返回任意子類對象。
    public Animal buyCat(){// 創建 cat 對象并返回Cat cat = new Cat("小七", 1, "乖巧");return cat;}

4、向下轉型

將子類對象轉換為父類時,會無法調用子類中特有的方法,但是有時候需要調用,那么此時將父類引用還原為子類對象即可,即向下轉換。

    public static void main(String[] args) {Animal animal = new Dog("毛毛", 5, "白色");// 將 Animal 類型對象強轉為 Dog 類型,此時可以調用 sleep() 方法Dog dog = (Dog) animal;dog.sleep();}

但是向下轉型很容易出現問題。

在這里插入圖片描述
Java 中為了提高向下轉型的安全性,引入了 instanceof。

instanceof 類名N:實際引用的是否為 N 類的對象,如果是返回true,否則返回false

如果該表達式為真,則可以安全轉換,否則不能進行安全轉換。

	public static void main(String[] args) {Dog dog = new Dog("毛毛", 5, "白色");Cat cat = new Cat("小七", 1, "乖巧");Animal animal = cat;animal = dog; // 此時 animal 實際指向的是 Dog 類的對象if(animal instanceof Cat){cat = (Cat)animal;cat.drink();}if(animal instanceof Dog){dog = (Dog)animal;dog.sleep();}}

運行結果:

在這里插入圖片描述
由上述結果可知,由于 animal 實際指向的是 Dog 類的對象,因此執行第二個 if 語句塊,將 animal 強轉為 Dog 類型對象,此時就可以調用 Dog 類中新增的成員方法。

5、多態的優缺點

【優點】

  1. 降低代碼的“圈復雜度”,即避免大量使用 if-else。
  2. 可擴展能力更強。

【缺點】

  1. 代碼的運行效率降低。
  2. 屬性沒有多態性:當子類和父類有同名屬性時,通過父類引用,只能引用父類自己的成員屬性。
  3. 構造方法沒有多態性。

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

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

相關文章

Ubuntu 24.04 LTS系統安裝RTX 4090顯卡驅動和cuda并部署ollama下載DeepSeek模型【自用詳細版】

自己搗鼓玩玩哈,正好有機子 1. 安裝驅動前的系統配置工作 卸載原有驅動并禁用nouveau sudo apt remove --purge nvidia*sudo cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.backup //備份文件sudo vim /etc/modprobe.d/blacklist.conf //修…

【一篇搞定配置】一篇帶你從配置到使用(PyCharm遠程)完成服務器運行項目(配置、使用一條龍)【全網最詳細版】

🌈 個人主頁:十二月的貓-CSDN博客 🔥 系列專欄: 🏀各種軟件安裝與配置_十二月的貓的博客-CSDN博客 💪🏻 十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光 目錄 1.…

Mamba模型

為什么要提出mamba模型? transformer特點:訓練快,推理慢,計算成本O(n*n) Rnn的特點:訓練慢,推理快,容易遺忘 其實很容易理解,因為RNN的輸入只包含前一個隱…

如何在 Windows 11 上查找計算機的 IP 地址?

原文:如何在 Windows 11 上查找計算機的 IP 地址? | w3cschool筆記 在開始之前,我們先來了解一下什么是 IP 地址: 假設你住在一棟公寓樓里,快遞員需要把包裹送到你家。為了確保快遞能準確送到,你需要提供…

2.Spring-注解開發定義bean/純注解開發/Spring整合MyBatis(p21-p30)

(一)注解開發定義bean (二)純注解開發 (三)bean的作用范圍 (三)xml配置和注解配置 (四)Spring整合MyBatis 要在pom.xml定義一下坐標。org.spr…

解決:Fontconfig head is null, check your fonts or fonts configurat

文章目錄 問題解決方案安裝字體依賴包強制刷新字體緩存驗證是否生效 個人簡介 問題 在使用 Java 環境部署或運行圖形相關應用時,比如圖片驗證碼,偶爾會遇到如下報錯: Fontconfig head is null, check your fonts or fonts configurat意味當…

『不廢話』之Llama 4實測小報

2025年4月5日Llama 4一開源,隨后OpenRouter等平臺就提供免費調用。對于中文社區來,官方的測評結果其實意義不大(原因先按下不表),就看知乎、微博、B站、twitter上的真實感受,最重要的是自己的真實案例測評。…

【NLP 56、實踐 ? LoRA完成NER任務】

目錄 一、數據文件 二、模型配置文件 config.py 三、數據加載文件 loader.py 1.導入文件和類的定義 2.初始化 3.數據加載方法 代碼運行流程 4.文本編碼 / 解碼方法    ① encode_sentence(): ② decode(): 代碼運行流程 ③ padding(): 代碼…

八大排序——c++版

本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…

mlir-tblgen 的應用漸進式示例

示例01 -gen-dialect-decls toy_dia.1.toy include "mlir/IR/OpBase.td" //include "mlir/IR/FunctionInterfaces.td" //include "mlir/IR/SymbolInterfaces.td" //include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Diale…

Go語言從零構建SQL數據庫(5)-Pratt解析算法:SQL表達式解析的核心引擎

Pratt解析算法&#xff1a;SQL表達式解析的核心引擎 1. 算法概述與工作原理 Pratt解析算法&#xff08;自頂向下運算符優先級解析&#xff09;是一種優雅的表達式解析方法&#xff0c;特別適合處理具有不同優先級運算符的復雜表達式。在我們的SQL解析器中&#xff0c;它負責解…

spring-ai-openai調用Xinference1.4.1報錯

1、Xinference 報錯logs 此處是調用 /v1/chat/completions 接口 2025-04-06 15:48:51 xinference | return await dependant.call(**values) 2025-04-06 15:48:51 xinference | File "/usr/local/lib/python3.10/dist-packages/xinference/api/restful_api.py", …

刻意練習:如何從新手到大師

1. 練習方式 練習主要有兩類&#xff1a;天真的練習和刻意練習。 所謂“天真的練習”&#xff0c;基本上只是反復地做某些事情&#xff0c;并指望只靠那種反復&#xff0c;就能提高表現和水平。一旦某個人的表現達到了“可接受”的水平&#xff0c;并且可以做到自動化&#x…

基于Java的人臉識別在線考試系統(jsp+springboot+mysql8.x)

基于Java的人臉識別在線考試系統(jspspringbootmysql8.x) 在線考試系統提供全面的考試管理和用戶管理功能。登錄界面支持管理員、教師和學生三種身份驗證&#xff0c;確保不同用戶訪問相應的功能模塊。系統自動組卷功能允許管理員根據不同科目和題型&#xff0c;如單選題、多選…

預測分析(二):基于機器學習的數值預測

文章目錄 基于機器學習的數值預測機器學習簡介監督學習的任務創建第一個機器學習模型機器學習的目標——泛化過擬合現象評價函數與最優化 建模前的數據處理進一步特征變換 多元線性回歸模型LASSO回歸kNN算法原理算法步驟k值的選擇 基于機器學習的數值預測 機器學習是人工智能的…

批量壓縮 jpg/png 等格式照片|批量調整圖片的寬高尺寸

圖片格式種類非常的多&#xff0c;并且不同的圖片由于像素、尺寸不一樣&#xff0c;可能占用的空間也會不一樣。文件太大會占用較多的磁盤空間&#xff0c;傳輸及上傳系統都非常不方便&#xff0c;可能會收到限制&#xff0c;因此我們經常會碰到需要對圖片進行壓縮的需求。如何…

生鮮果蔬便利店實體零售門店商城小程序

——線上線下融合賦能社區零售新生態 隨著新零售模式的深化和消費者需求的升級&#xff0c;生鮮果蔬便利店亟需通過數字化工具實現經營效率與用戶體驗的雙重提升。結合線下實體門店與線上商城的一體化小程序&#xff0c;成為行業轉型的核心工具。以下從功能模塊、運營策略及行…

如何開通google Free Tier長期免費云服務器(1C/1G)

Google宣布的一項政策&#xff0c;為標準層級的網絡提供每地域200G的免費流量。兩項政策結合&#xff0c;于是便可以得到一臺1核心、1G內存、30G磁盤、200G流量的小云服務器&#xff0c;可玩性大大提高。這篇文章就分享一下如何正確開機&#xff0c;避免產生額外的費用。 免費…

C# 多線程并發編程基礎

1. 線程基礎 1.1 線程簡介 C# 中的線程是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程中&#xff0c;是進程中的實際運作單位。一個進程可以包含多個線程&#xff0c;這些線程可以并發執行不同的任務。 1.2 線程的創建與啟動 在 C# 中&#xff0c;可以使…

【Introduction to Reinforcement Learning】翻譯解讀2

2.2 馬爾可夫決策過程&#xff08;MDPs&#xff09; 馬爾可夫決策過程&#xff08;MDP&#xff09;為順序決策提供了框架&#xff0c;其中動作不僅影響即時獎勵&#xff0c;還會影響未來結果。與多臂老虎機問題不同&#xff0c;MDP中的即時獎勵與延遲獎勵相平衡。在多臂老虎機…