Java基礎第4天總結(多態)

package com.itheima.duotai;public class Animal {String name = "動物";public void run(){System.out.println("動物會跑~~~");}
}
package com.itheima.duotai;public class Wolf extends  Animal{String nama = "狼";@Overridepublic void run() {System.out.println("🐺跑的賊溜~~~");}
}
package com.itheima.duotai;public class Cat extends  Animal{String name = "小貓";@Overridepublic void run() {System.out.println("🐱跑的賊慢~~~");}
}
package com.itheima.duotai;public class Test {public static void main(String[] args) {//對象多態,行為多態Animal a1 = new Wolf();//父類引用子類對象a1.run();//方法:編譯看左邊,運行看右邊System.out.println(a1.name);//成員變量:編譯看左邊,運行也看左邊Animal a2 = new Cat();//父類引用子類對象a2.run();System.out.println(a2.name);}
}

運行結果:

🐺跑的賊溜~~~
動物
🐱跑的賊慢~~~
動物



  • 多態的前提:有繼承關系;存在父類引用子類對象;存在方法重寫
  • 多態是對象、行為的多態,Java中的屬性(成員變量)不談多態。
  • 在多態形式下,右邊對象是解耦合的,更便于擴展和維護。
  • 定義方法時,使用父類類型的形參,可以接收一切子類對象,擴展性更強,更便利。
  • 多態下不能使用子類的獨有功能。

package com.itheima.duotai;public class Animal {String name = "動物";public void run(){System.out.println("動物會跑~~~");}
}
package com.itheima.duotai;public class Wolf extends  Animal{String nama = "狼";@Overridepublic void run() {System.out.println("🐺跑的賊溜~~~");}//狼吃羊public void eatSheep(){System.out.println("🐺吃羊~~~");}
}
package com.itheima.duotai;public class Cat extends  Animal{String name = "小貓";@Overridepublic void run() {System.out.println("🐱跑的賊慢~~~");}public void catchMouse(){System.out.println("小貓會捉老鼠~~~");}
}
package com.itheima.duotai;public class Test {public static void main(String[] args) {Animal a = new Wolf();//a.eatSheep();報錯,多態下不能調用子類獨有功能//強制類型轉換:可以解決多態下調用子類獨有功能的問題Wolf ww = (Wolf)a;ww.eatSheep();System.out.println("-----------------");Wolf w = new Wolf();go(w);Cat c = new Cat();go(c);}public static void go(Animal a){a.run();//多態下不能調用子類獨有的功能。//但是可以強制類型轉換//轉換前先用instanceof判斷真實性,再進行強制類型轉換。if(a instanceof Wolf ){Wolf w = (Wolf)a;w.eatSheep();}else if(a instanceof Cat){Cat c = (Cat)a;c.catchMouse();}}
}
  • 小案例:加油站支付小模塊
  • 車主可以辦理金卡和銀卡
  • 卡片信息包括:車牌號碼、車主姓名、電話號碼、卡片余額
  • 金卡辦理時存入金額必須>=5000元,銀卡辦理時存入金額必須>=2000元,金卡支付時享受8折優惠,銀卡享受9折優惠,金卡消費滿200元可以提供打印洗車票的服務
  • 需求:請使用面向對象編程,完成該加油站支付機的存款和消費程序
package com.itheima.demo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//lombok技術可以實現getter和setter方法 無參構造器 toString方法等
@Data // @Data注解可以自動生成getter和setter方法 無參構造器 toString方法等
@AllArgsConstructor// @AllArgsConstructor注解可以自動生成帶參數的構造器
@NoArgsConstructor//有參構造器寫了,@Data中的無參構造器就沒了,這里還要再加一個無參構造器
//用上面這三個注解需要設置一下idea,允許注解程序,設置一次就行:File->settings->搜索annotat->在Enable annotation processing前打對勾->apply->ok
public class Card {private String cardId;private String name;private String phone;private double money;//預存金額public void deposit(double money){this.money += money;}//消費金額public void consume(double money){this.money -= money;}
}
package com.itheima.demo;public class GoldCard extends  Card{public GoldCard(String cardId, String name, String phone, int money) {super(cardId, name, phone, money);}@Overridepublic void consume(double money) {System.out.println("您當前消費:"+ money);System.out.println("優惠后的價格:"+ money*0.8);if(getMoney()<money*0.8){System.out.println("余額不足!");return;}//更新金卡賬戶余額setMoney(getMoney()-money*0.8);//消費大于200,打印洗車票if(money*0.8>=200){printTicket();}else{System.out.println("無洗車票");}}//打印洗車票public void printTicket(){System.out.println("請洗車");}
}
package com.itheima.demo;public class SilverCard extends Card{public SilverCard(String cardId, String name, String phone, int money) {super(cardId, name, phone, money);}@Overridepublic void consume(double money) {System.out.println("您當前消費:"+ money);System.out.println("優惠后的價格:"+ money*0.9);if(getMoney()<money*0.9){System.out.println("余額不足");return;}//更新金卡賬戶余額setMoney(getMoney()-money*0.9);}
}
package com.itheima.demo;import java.util.Scanner;public class Test {public static void main(String[] args) {//1、創建卡片類,以便創建金卡或者銀卡對象,封裝車主數據//2、定義一個卡片父類:Card,定義金卡或者銀卡的共同屬性和方法//3、定義金卡類:GoldCard,繼承Card類,重寫消費方法(8折),獨有打印洗車票//4、定義銀卡類:SilverCard,繼承Card類,重寫消費方法(9折)//5、辦一張金卡:創建金卡對象,交給一個獨立的業務(支付機)來完成:存款,消費GoldCard gc = new GoldCard("123456","張三","13800000001",5000);pay(gc);//6、辦一張銀卡:創建銀卡對象,交給一個獨立的業務(支付機)來完成:存款,消費SilverCard sc = new SilverCard("123456","張三","13800000001",2000);pay(sc);}//支付機:用一個方法來刷卡:可能金卡,也可能銀卡,所以形參用父類Cardpublic static void pay(Card c){System.out.println("請刷卡,輸入消費金額");Scanner sc = new Scanner(System.in);double money = sc.nextDouble();c.consume(money);}
}

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

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

相關文章

Git克隆時遇到“Filename too long“錯誤的完美解決方案

Git克隆時遇到"Filename too long"錯誤的完美解決方案 問題描述 在使用Git克隆項目時&#xff0c;你是否遇到過這樣的錯誤&#xff1a; $ git clone gitexample.com:project.git Cloning into project... remote: Enumerating objects: 1883, done. remote: Count…

分享一個基于Python與spark大數據的護膚品市場用戶行為分析與可視化平臺,基于hadoop的護膚品使用行為追蹤與分析可視化平臺的設計與實現

&#x1f495;&#x1f495;作者&#xff1a;計算機源碼社 &#x1f495;&#x1f495;個人簡介&#xff1a;本人八年開發經驗&#xff0c;擅長Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬蟲、大數據、機器學習等&#xff0c;大家有這一塊的問題…

頁面中嵌入Coze的Chat SDK

Coze 為將 AI 聊天機器人(Bot)嵌入您的網頁提供了兩種主流方式:Web SDK 和 API 接口調用。它們分別適用于不同的場景,下面我將為您介紹這兩種方法,并提供一些選擇建議。 特性 Web SDK API 接口調用 實現方式 引入一段JS代碼,快速嵌入一個預制的聊天窗口 通過HTTP API發送…

DataEase+MaxKB:讓BI再多個“A”

一、前言當前DataEase BI更多聚焦于BI展示層&#xff0c;然而&#xff0c;在與組件Copilot 以及后續計劃替換的 Sqlbot的融合方面&#xff0c;目前仍存在一些亟待解決的問題&#xff0c;當它們嘗試與 DataEase 進行結合應用時&#xff0c;出現了兩種較為突出的狀況。一方面&…

VUE 的彈出框實現圖片預覽和視頻預覽

這是一個基于Vue3封裝的媒體預覽組件&#xff0c;主要功能包括&#xff1a;多格式支持&#xff1a;可同時預覽圖片和視頻圖片操作功能&#xff1a;縮放&#xff08;支持滾輪縮放和按鈕控制&#xff09;旋轉&#xff08;90度增量旋轉&#xff09;拖拽&#xff08;僅在放大狀態下…

【Linux基礎知識系列】第一百零九篇 - 使用shell的輸入與輸出重定向

在 Linux 系統中&#xff0c;Shell 是用戶與操作系統交互的界面&#xff0c;通過命令行輸入命令來執行各種操作。輸入與輸出重定向是 Shell 編程中非常重要的概念&#xff0c;它允許用戶將命令的輸出保存到文件中&#xff0c;或者從文件中讀取輸入&#xff0c;從而實現更靈活的…

Redis面試精講 Day 30:Redis面試真題解析與答題技巧

【Redis面試精講 Day 30】Redis面試真題解析與答題技巧 在“Redis面試精講”系列的第30天&#xff0c;我們迎來收官之作——Redis面試真題解析與答題技巧。這一天的核心目標是&#xff1a;幫助你系統化梳理前29天所學知識&#xff0c;掌握高頻面試題的解題思路&#xff0c;提升…

設計模式:單例模式(Singleton Pattern)

文章目錄一、單例模式的概念二、單例模式的結構三、常見實現方式3.1 餓漢式單例3.2 懶漢式單例一、單例模式的概念 單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;它的核心思想是&#xff1a;保證在一個進程中&#xff0c;某個類僅有一個…

Swift 解法詳解 LeetCode 362:敲擊計數器,讓數據統計更高效

文章目錄 摘要 描述 題解答案 題解代碼分析 代碼講解 示例測試及結果 時間復雜度 空間復雜度 總結 摘要 “敲擊計數器”這道題聽上去像個小游戲里的功能,但其實它背后對應的是一個常見的需求:在過去一段時間內統計事件發生的次數。比如網站的訪問量統計、API 調用次數限制、…

coze工作流200+源碼,涵蓋AI文案生成、圖像處理、視頻生成、自動化腳本等多個領域

AI 博主風哥在github分享了 200 實用生產力coze工作流&#xff0c;涵蓋AI文案生成、圖像處理、視頻生成、自動化腳本等多個領域&#xff0c;導入即用&#xff0c;項目地址https://github.com/Hammer1/cozeworkflows github下載慢也可前往該地址下載https://pan.baidu.com/s/1fC…

AI與SEO關鍵詞協同優化

內容概要 人工智能&#xff08;AI&#xff09;技術的迅猛發展正深刻變革著搜索引擎優化&#xff08;SEO&#xff09;的實踐方式&#xff0c;特別是在關鍵詞策略這一核心領域。兩者的深度融合&#xff0c;為企業在數字海洋中精準導航提供了前所未有的強大工具。通過AI驅動的智能…

【Unity開發】Unity核心學習(二)

二、動畫基礎 1、Animation動畫窗口 &#xff08;1&#xff09;介紹&#xff08;2&#xff09;Animation窗口功能2、創建編輯動畫 面板變化&#xff1a;動畫文件界面&#xff1a;3、Animator動畫狀態機 &#xff08;1&#xff09;有限狀態機概念&#xff08;2&#xff09;Anima…

NETSDK1045 當前 .NET SDK 不支持將 .NET 8.0 設置為目標。請將 .NET 5.0 或更低版本設置為目標,或使用支持

C# 項目中的目標框架無法修改并且顯示為空 嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態 錯誤 NETSDK1045 當前 .NET SDK 不支持將 .NET 8.0 設置為目標。請將 .NET 5.0 或更低版本設置為目標&#xff0c;或使用支持 .NET 8.0 的 .NET SDK 版本。 Padim C:\Program …

MNIST 數據集mnist.npz詳解

MNIST 數據集是機器學習領域最著名的數據集之一&#xff0c;全稱為"Modified National Institute of Standards and Technology"數據庫。它包含了大量手寫數字的圖像&#xff0c;是入門機器學習和深度學習的經典數據集。1. MNIST 數據集概述 60,000 張訓練圖像 10,00…

深入理解HTTPS:從概念到實戰優化

深入理解HTTPS&#xff1a;從概念到實戰優化一&#xff1a;概述二&#xff1a;工作流程三&#xff1a;創建自簽名證書四&#xff1a;案例1&#xff09;案例一&#xff1a;HTTPS 搭建2&#xff09;案例二&#xff1a;HTTP/2 搭建3&#xff09;案例三&#xff1a;HTTP 重定向 HTT…

MySQL數據備份與恢復全攻略

一、數據備份與恢復按照備份方式分類&#xff1a;物理備份&#xff0c;直接復制數據庫的物理文件&#xff0c;可以直接拷貝和恢復&#xff1b;邏輯備份&#xff0c;通過SQL語句導出數據庫結構和數據&#xff0c;可用于不同版本和不同類型的MySQL數據庫之間的數據遷移。按照數據…

單機多卡間大張量傳輸迷惑行為?

老鐵們我最近真的好慘&#x1f62d;&#xff0c;一個大模型在單機多卡上運行就是出錯&#xff0c;debug看的老眼昏花&#xff0c;最后發現大張量在設備間直接傳輸會有很發癲的行為&#xff0c;還請大家幫我看看&#x1f647;?摒棄屎山一樣的代碼&#xff0c;簡單運行下列腳本i…

無法將“pnpm”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確,然后再試一次。

1 問題描述今天使用pnpm安裝如下報錯&#xff1a;pnpm : 無法將“pnpm”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正確&#xff0c;然后再試一次。 所在位置 行:1 字符: 1pnpm install~~~~ Categor…

內核編譯 day61

二&#xff1a;內核啟動 一&#xff1a;流程 sudo vim /etc/network/interfaces sudo chmod 0666 /etc/default/tft...... //修改可讀uboot命令&#xff1a; help/&#xff1f; &#xff1a; 幫助手冊&#xff0c;列出uboot支持的所有命令 printenv/print 打印環境變量 sete…

【YOLOv5部署至RK3588】模型訓練→轉換RKNN→開發板部署

已在GitHub開源與本博客同步的YOLOv5_RK3588_object_detect項目&#xff0c;地址&#xff1a;https://github.com/A7bert777/YOLOv5_RK3588_object_detect/tree/main 詳細使用教程&#xff0c;可參考README.md或參考本博客第六章 模型部署 文章目錄一、項目回顧二、模型選擇介紹…