【從零開始學Java筆記】多態

来源:https://www.cnblogs.com/zllk/archive/2020/04/07/12656950.html
-Advertisement-
Play Games

大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 什麼是多態? 編程其實就是一個將具體世界進行抽象化的過程 ...


大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。

【從零開始學Java筆記】目錄

什麼是多態?

編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。一句話來說就是,多態是同一個行為具有多個不同表現形式或形態的能力。如果這裡還不懂,不要緊,現急需往下看。

多態的前提

1.子父類的繼承關係
2.方法的重寫
3.父類引用指向子類對象

格式:

1.父類引用Animal a
2.指向=
3.子類對象new Cat( )

示例

對不同類的對象發出相同的消息將會有不同的行為。比如,一個鏟屎官每天早上需要給自己家的寵物喂食,鏟屎官只需要在規定時間下達命令:“開始吃飯”即可,而不需要對貓說:“開始吃魚”,對狗說:“開始吃骨頭”, 因為“寵物”是一個抽象的事物, 只要是寵物就可以吃東西,但是只要他知道自己吃什麼就行了。

public class PolymorphicDemo {
    public static void main(String[] args) {
        Animal a = new cat();
        a.eat();
    }
}

class Animal{
    public void eat(){
        System.out.println("動物吃食物");
    }
}

class cat extends Animal {

    @Override
    public void eat() {
        System.out.println("貓吃魚");
    }

}
輸出結果
貓吃魚

雖然a指向的是父類Animal,但是調用的確實子類的eat()方法,這就是動態綁定。
動態綁定:運行期間調用的方法,是根據其具體的類型

多態的成員特點

成員變數編譯時看的是左邊,運行時看的左邊
成員方法編譯時看的是左邊,運行時看右邊
靜態方法編譯時看的是左邊,運行時看的也是左邊(使用變數去調用靜態方法,其實相當於用變數類型的類名去調用)

public class Polymorphic {
	public static void main(String[] args) {
		Dad d  = new Son();
		System.out.println(d.num);
		d.method();
		d.function();
		
	}
	
	


}

class Dad{
    //沒有會報錯
	int num = 20;
	
	public void method() {
		System.out.println("爸爸的方法");
	}
	
	public static void function() {
		System.out.println("爸爸的靜態方法");
	}
}

class Son extends Dad{
	int num = 10;
	
	public void method() {
		System.out.println("兒子的方法");
	}
	
	public static void function() {
		System.out.println("兒子的靜態方法");
	}
}
輸出結果
20
兒子的方法
爸爸的靜態方法

總結:編譯時看的都是左邊(編譯錯誤,就是在編譯之前並沒用建立對象,就是說父類並沒有子類的方法,所有必須父類有子類的方法,子類重寫才能運行通過),運行時成員方法看的是右邊(動態綁定),其他(成員變里和靜態的方法)看的都是左邊(沒有動態綁定)

多態中的向上轉型和向下轉型:

引用類型之間的轉換
向上轉型:由小到大(子類型轉換成父類型)
向下轉型:由大到小

基本數據類型的轉換
自動類型轉換
由小到大:byte short char --- int --- long --- float --- double
強制類型轉換
由大到小

public class PolymorphicDemo1 {
	public static void main(String[] args) {
		Animal2 a = new Dog();//向上轉型
//		a.swim();//無法調用
		
		Dog d  = (Dog) a;//向下轉型
		d.swim();
	}
	

}


class Animal2{
	public void eat() {
		System.out.println("吃東西");
	}
}

class Dog extends Animal2
{
	public void eat() {
		System.out.println("啃骨頭");
	}
	
	public void swim() {
		System.out.println("游泳");
	}
}

多態的優缺點

優點:可以提高可維護性(多態前提所保證的),提高代碼的可擴展性
缺點:無法直接訪問子類特有的成員

多態的作用

  1. 應用程式不必為每一個派生類編寫功能調用,只需要對抽象基類進行處理即可。大大提高程式的可復用性。
  2. 派生類的功能可以被基類的方法或引用變數所調用,這叫向後相容,可以提高可擴充性和可維護性。

一些疑惑

其實作者在剛學習多態的時候一直不理解多態有什麼用?總感覺多此一舉,因為子類重寫了父類的方法,那為什麼不直接實例子類或者父類?這樣不僅可以使用子類的方法,子類還繼承了父類,還能調用父類的方法。
其實作者認為這裡原因有二,一是初學多態的時候,示例總是過於簡單,例如本文之前貓吃魚的例子,確實完全不需要多態反而更方便。二就是繼承和多態沒有分清楚,上述問題全是基於繼承的一種想法去思考,然後發現多態和繼承沒有區別。

這裡再給大家舉個例子:
當有一個基類,比如說形狀類Shape,然後其有一個方法getDesc()獲得其描述。Shape的子類Circle,Triangle,各自重載其父類的getDesc()方法,Circle的getDesc()返回“我是圓形”,Triangle的getDesc()返回“我是三角形”。然後某一個類的某一個方法如下:

String test(Shape shape){
return shape.getDesc();
}

你在調用test()方法時可里往裡面傳的參數類型可以是Shape、Circle或Triangle,多態能夠保證getDesc()方法被正確調用,這叫動態綁定,從而你不用寫三個如下的方法,即test(Shape s),test(Circle c),test(Triangle t)

就可以理解了,多態是為了實現對一個元素進行操作就能滿足所有這個元素子類的操作需求。這也就是為什麼多態只能使用父類的方法,同時在調用時動態綁定實例出來的子類。因為像形狀的例子例子中,以參數的形勢接收父類,編譯父類的方法,在運行時動態綁定相應的子類。即可達到目標。

如果任然不理解,還是沒有問題,因為多態本身就是一個非常抽象的概念。在後期不斷地深入學習中,帶著問題去解決問題,慢慢就會撥開雲霧見青天。然後也會慢慢體會多態的神奇魅力。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 筆者:風起怨江南 出處:https://www.cnblogs.com/mengjinxiang 筆者原創,文章歡迎轉載,如果喜歡請點贊+關註,感謝支持! 前言:最近一直在其他博客論壇上寫Python的相關技術博客->https://blog.csdn.net/JackMengJin,計劃還是在博客 ...
  • 2019python之年: 2019是個挫折之年,但又是幸運之年,這一年創業遭遇滑鐵盧,幾與破產,充滿著迷茫,路在何方?? 開始接觸python是在微信朋友圈,結緣於廣告,覺得很有意思,但一直沒有深入接觸,後來在機緣巧合下,在各方壓迫之下,於8月份決心開始學習python, 萬事開頭難,但決心已定, ...
  • 隊列 隊列是用數組或鏈表實現的,遵循先進先出規則的一個有序列表 使用數組模擬隊列 分析:雖然隊列中的元素已經全部出隊,但是由於我們的隊列是使用數組模擬的,而且每次入隊的時候,頭指定都後移,當我們入隊次數增加,總有一時刻,頭指針指向數組最大下標,儘管我們有出隊,但是任然不能入隊元素,我們可以使用數組模 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 首先要聲明一點,無論什麼語言都沒有高低貴賤之分,語言只是 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 這裡的Java基礎並不是真正的Java基礎,而是一些無法 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" Java語言是一種面向對象的程式設計語言,而面向對象思想 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 封裝概述 面向對象三大特征之一。 面向對象編程語言對客觀 ...
  • 大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" 什麼是繼承? 繼承就是子類繼承父類的特征和行為,使得子類 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...