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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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或参考本博客第六章 模型部署 文章目录一、项目回顾二、模型选择介绍…