一文講解——Java多態

目錄

  • 一、什么是多態?
  • 二、轉型
    • 向上轉型
    • 向下轉型
  • 三、方法覆蓋與方法重載
  • 四、綁定
    • 動態綁定
    • 靜態綁定
  • 五、理解多態

在這里插入圖片描述

一、什么是多態?

多態的詞組字面意思是: 某種事物多種形態。
但是對于我們學習Java 的程序原來說,就不不能簡單這樣來理解了。
多態是 完成某個行為,不同的對象去實現會有不同的效果。現在還看不懂其實沒關系,也就簡單提一嘴。

舉個栗子:
在這里插入圖片描述

有一天,學校二食堂做了一大盤深海大閘蟹,你和小帥同時在排隊。此時一位長得very beautiful 的女生——小美來了,到窗口看了一下菜,感覺不錯,也想吃。但是排隊的人太多了,就想插下隊。你一看,我丟想插隊,門都沒有,表現出不肯的樣子。而你后面的小帥眼睛一亮,就說,小美同學你好,我看你插隊的話影響不好,不如我多打一份給你,倒時候加個微信發我就行了。此時這就是多態,不同的人對一件事表現出不同的狀態。到頭來‘你’還在為什么,自己還單身著。小帥到后面,小美微信也加了,說:就一頓飯錢也沒多少,算了算了。此時小美就非常感動,說:小帥同學下次我會請你吃一頓。這樣一來而去。。。

磨刀不誤砍柴功,要想學真正學會多態就要理解一下,向上轉型是怎么轉的?靜態綁定是怎么綁定的,方法的覆蓋是?最后,學完才可以說學會了Java 的多態,太哇塞了!!!

二、轉型

向上轉型

向上轉型: 父類 引用 子類型對象
也好理解 兒子孝順父親,給父親買點禮物,父親樂意地接受了。

例子:創建一個父類 Animal 其子類有Dog, Cat
測試類 Test

public class Animal {public String name;//無參構造方法public Animal() {}//有參構造方法public Animal(String name) {this.name = name;}//動物會說方法public void speak() {System.out.println("會說話-----------");}}
public class Cat extends Animal{//無參構造方法public Cat() {}//有參構造方法public Cat(String name) {super(name);//子類繼承父類,就要先對父類進行初始化}public void speak() {System.out.println(this.name+"會喵喵叫-----");}}
public class Dog extends Animal{//無參構造方法public Dog() {}//有參構造方法public Dog(String name) {super(name); //子類繼承父類,就要先對父類進行初始化}public void speak() {System.out.println(this.name+"會汪汪叫------");}//dog 特有的方法public void lookHouse() {System.out.println(this.name+"會看家-----------");}}
public class Test {public static void main(String[] args) {Animal dog = new Dog("小黑");dog.speak();Animal cat = new Cat("小咪");cat.speak();}
}

有三種表示方式
1.直接賦值
在這里插入圖片描述

2.方法傳參
在這里插入圖片描述

3.返回值
在這里插入圖片描述

總結
優點 父類可以接受任何的子類

又創建了一個Cat 類 ,也是可以接受的
在這里插入圖片描述
缺點 不能調用子類特有方法,因為你還是Animal 類!在這里插入圖片描述

向下轉型

父類強轉子類

Animal 轉為 Dog子類
a instanceof b : 判斷 a 是否為b類型 。是返回 true ,否返回false


public class Test {public static void main(String[] args) {Animal animal = new Dog("小黑");if(animal instanceof Dog) { Dog dog = (Dog)animal;//可以 調用子類特有的方法dog.lookHouse();}}
}

注意了 強轉是要注意 子類一致
一開始是狗,怎么強轉成貓呢?
就像養一只小狗,再怎么養,也不會變成小貓。因為一生下來就決定了的。


public class Test {public static void main(String[] args) {Animal animal = new Dog("小黑");Cat cat = (Cat) animal; //errorcat.speak(); //error}
}

在這里插入圖片描述

總結:在這里插入圖片描述

三、方法覆蓋與方法重載

方法重載: 我想大家都應該知道:就是在同一個類中,方法名相同,參數列表不同。就只要記住一個方法名,就可以調用不同的參數列表,提高了效率。

以add() 加法為例子:

public class Test {public static void main(String[] args) {System.out.println("方法重載");//相同 add方法名,不同參數列表。構成方法重載System.out.println(add(1,5));System.out.println(add(1,2,3));}public static int add(int a,int b) {return a+b;}public static int add(int a,int b,int c) {return a+b+c;}
}

方法覆蓋: 也叫方法重寫。發生在父子類之間的關系,方法名相同,參數列表相同,返回值也要相同。
也好理解,重寫是重新再寫一遍唄,不改變原來的
父類的方法完成不了子類的需求,就要重寫
在這里插入圖片描述
方法覆蓋也存在一些細節
1.static ,final ,private 修飾的方法,構造方法 不能被重寫。
2.子類重寫的方法,訪問權限要 >= 父類 原來的方法。
3.重寫方法的返回值類型也可不同,但是要構成父子類關系
在這里插入圖片描述

四、綁定

動態綁定

動態綁定是理解多態的基礎。
那什么是動態綁定呢?
程序在編譯的時候,確實是調用了父類的方法。但在運行的時候,通過父類的引用,調用的卻是子類重寫父類的那個方法。這就叫動態綁定。

還是以之前的Animal ,Dog 為例子:
不是輸出: 會說話-------在這里插入圖片描述

靜態綁定

“靜態綁定"也稱為"早期綁定”。
簡單 就相當于平時調用方法 。就是調用這個方法時,編譯器確定調用這個方法。

public class Test {public static void main(String[] args) {Test test = new Test();test.func(); //確定調用func()}public  void func() {System.out.println("我就是一個普通的方法------");}
}

五、理解多態

現在,我們學習了
向上轉型 就是父類型 引用 子類型對象 ,方法的重寫是 父類的方法完成不了子類的需求,就要重寫。 靜態綁定:運行是調用子類重寫父類的方法。

請看

public class Test {public static void main(String[] args) {Animal dog = new Dog("小黑");Animal cat = new Cat("小花");autoSpeak(dog);autoSpeak(cat);}public static void autoSpeak(Animal animal) {animal.speak();}
}

在這里插入圖片描述
在這里插入圖片描述

autoSpeak() 方法就會自動的調用 子類的speak()方法。
不要判斷 是否為 Dog 類 還是 Cat 類。
1.能夠降低代碼的 “圈復雜度”, 避免使用大量的 if - else
2.可擴展能力強

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

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

相關文章

springboot中線程池的使用

一、概念 線程池就是將多個線程對象放入一個池子里面,例如一個池塘,線程池就是這個池塘,池塘里面的魚就是線程池中的多個線程對象。1. 每一個線程,在一段時間內只能執行一個任務。2. 線程池中的各個線程是可以重復使用的。 二、創…

2024年內外貿一體化融合發展(長沙)交易會 ?辦公文具、禮品工藝品展

2024年內外貿一體化融合發展(長沙)交易會 辦公文具、禮品工藝品展 時間:2024年7月12-14日 地點:湖南國際會展中心(芒果館) 湖南省商廳 關于邀請參加2024內外貿一體化融合發展(長沙&#xf…

Weblogic XML反序列化漏洞 [CVE-2017-10271]

漏洞環境搭建請參考 http://t.csdnimg.cn/i11e2 漏洞原理 Weblogic的wls security組件對外提供webservice服務,wls security組件使用了xmldecoder來解析用戶傳入的xml數據,如果用戶進行xml惡意數據的構造,即可觸發反序列化漏洞 漏洞版本 O…

簡述vue的實現原理

Vue.js 的實現原理可以概括為以下幾個方面: 響應式系統: Vue 的核心是其響應式系統。當 Vue 實例被創建時,它會遍歷 data 對象中的所有屬性,并使用 Object.defineProperty 方法將其轉換為 getter 和 setter。當 data 中的屬性發生…

python:如何創建簡單的流媒體服務器來播放.flv文件

要在Python中創建一個簡單的流媒體服務器來播放FLV(Flash Video)文件,你通常需要一個HTTP服務器,該服務器能夠處理對FLV文件的范圍請求(Range Requests),因為流媒體通常不是一次性下載整個文件&…

CentOS 7.9 郵箱部署——Postfix+Dovecot詳細

PostfixDovecot 文章目錄 PostfixDovecot資源列表基礎環境一、部署DNS二、部署postfix和dovecot2.1、配置postfix2.2、配置dovecot2.3、創建郵件用戶 三、發送郵件測試3.1、windows安裝poxmail3.2、登錄郵箱3.3、發送接收郵件 四、搭建SSL認證加密4.1、生成私鑰4.2、生成公鑰4.…

正則工具類

目錄 1、 * 正則工具類 1.1、 * 提供驗證郵箱、手機號、電話號碼、身份證號碼、數字等方法 1.1.1、 * 驗證固定電話號碼 1.1.2、 * 驗證整數(正整數和負整數) 1.1.3、 * 驗證整數和浮點數(正負整數和正負浮點數)

貪心算法4(c++)

過河的最短時間 題目描述 輸入 在漆黑的夜里,N位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,N個人一共只帶了一只手電筒,而橋窄得只夠讓兩個人同時過,如果…

YOLOv8_pose預測流程-原理解析[關鍵點檢測理論篇]

YOLOv8_seg的網絡結構圖在博客YOLOv8網絡結構介紹_CSDN博客已經更新了,由網絡結構圖可以看到相對于目標檢測網絡,實例分割網絡只是在Head層不相同,如下圖所示,在每個特征層中增加了KeyPoint分支(淺綠色),通過兩個卷積組和一個Conv卷積得到得到通道數為51的特征圖,51表示…

window環境下QT5開發環境的搭建

1、安裝visual Stusio 15 生成工具2012 2、安裝Visual studio Enterprise 2017 3、Visual studio Enterprise 2017安裝完成之后, 修改:選擇桌面調試,如下: 4、打開QTcreator,選項中,配置編譯器&#xff…

摸魚大數據——Hive基礎理論知識——Hive環境準備

Hive環境準備 1、shell腳本執行方式 方式1: sh 腳本 注意: 需要進入腳本所在目錄,但腳本有沒有執行權限不影響執行 方式2: ./腳本 注意: 需要進入腳本所在目錄,且腳本必須有執行權限 方式3: /絕對路徑/腳本 注意: 不需要進入腳本所在目錄,但必須有執行…

線程池,日志

所要用到的知識點: 多線程的創建 生產消費模型, 線程鎖 條件變量 代碼: 線程池日志

基于STC12C5A60S2系列1T 8051單片機的TM1638鍵盤數碼管模塊的數碼管顯示與單片機連接的按鍵的按鍵值的功能

基于STC12C5A60S2系列1T 8051單片機的TM1638鍵盤數碼管模塊的數碼管顯示與單片機連接的按鍵的按鍵值應用 STC12C5A60S2系列1T 8051單片機管腳圖STC12C5A60S2系列1T 8051單片機I/O口各種不同工作模式及配置STC12C5A60S2系列1T 8051單片機I/O口各種不同工作模式介紹TM1638鍵盤數碼…

C++面向對象程序設計 - 輸入和輸出

程序的輸入指的是文件將數據傳送給程序,程序的輸出指的是從程序將數據傳送輸出文件。 C的輸入和和輸出包括以下三個方面: 對系統指定的標準設備的輸入和輸出,即從鍵盤輸入數據,輸出到顯示器屏幕。以外存磁盤(或光盤、…

初探 Spring Boot Starter Security:構建更安全的Spring Boot應用

引言 Spring Boot 作為 Java 生態系統下的熱門框架,以其簡潔和易上手著稱。而在構建 Web 應用程序時,安全性始終是開發者必須重視的一個方面。Spring Boot Starter Security 為開發者提供了一個簡單但功能強大的安全框架,使得實現身份驗證和…

從動態代理角度簡單理解Spring AOP

1. 概述 動態代理 是指在運行時,動態地創建目標類的代理對象,并對其中特定的方法進行攔截或增強的技術。這種技術主要用于在不修改目標類代碼的情況下,增強目標類的功能。 在Java中,動態代理主要基于Java的反射機制和接口來實現…

gdc2024:Raytracing in Snowdrop技術實現與性能優化策略

在今年的GDC(游戲開發者大會)的Advanced Graphics Summit上,關于Snowdrop引擎中光線追蹤技術的討論引起了廣泛關注。 一、光線追蹤全局照明的實現細節 屏幕空間追蹤: 屏幕空間追蹤從相機出發,對屏幕上的每個像素點生成…

DDL—表—數據類型—字符串類型相關語法

(1)表格可視化 普通字符串 類型大小描述CHAR0~255 bytes定長字符串,其表示即使你存儲一個字符,它也會占用你括號里個數的字符的空間,因為未占用的字符的其它空間會用空格進行補位。需要再后面跟一個參數:…

harmony 鴻蒙ArkUI動畫/交互事件開發常見問題(ArkTS)

ArkUI動畫/交互事件開發常見問題(ArkTS) 焦點事件onBlur/onFocus回調無法觸發(API 9) 問題現象 焦點事件onBlur/onFocus回調無法觸發 解決措施 焦點事件默認情況下需要外接鍵盤的Tab鍵,或方向鍵觸發,點擊觸發焦點事件需要添加焦點控制屬性focusOnTo…

Linux 監控USB硬盤插拔事件并自動掛載和卸載

定義udev規則來監控USB插拔事件。 一、在/etc/udev/rules.d目錄下隨意創建一個規則文件,例:99-usb-mount.rules KERNEL"sd[b-z]?",SUBSYSTEM"block",RUN"/usr/local/src/mountusb.sh %k $env{ACTION}"二、創建 /usr/lo…