当前位置: 首页 > news >正文

【练习九】Java实现加油站支付小程序:存款与消费

目录

一、该代码主要实现以下功能:

二、实现以上功能的代码如下:


一、该代码主要实现以下功能:

1)类结构设计(基于继承关系)

  • 父类Card:封装了所有卡片的共性属性(卡号carId、持卡人姓名name、电话phone、余额money)和基础功能(preStore存款方法、consume消费方法),通过 Lombok@Data等注解自动生成 gettersetter 等方法。
  • 子类GoldCard(金卡):继承Card,重写consume方法实现 8 折优惠,新增printTicket方法(消费满 200 元赠送洗车票)。
  • 子类SilverCard(银卡):继承Card,重写consume方法实现 9 折优惠。

2)核心业务功能

  • 存款功能:通过in方法实现,支持用户输入存款金额,调用卡片的preStore方法将金额存入卡内,并显示当前余额。
  • 消费功能:通过pay方法实现,支持用户输入消费金额,根据卡片类型(金卡 / 银卡)自动应用对应折扣(8 折 / 9 折):
    1. 金卡:消费时计算 8 折后金额,若余额不足则提示失败;若折后金额≥200 元,自动打印洗车票。
    2. 银卡:消费时计算 9 折后金额,若余额不足则提示失败。

3)程序演示流程

  1. 创建一张金卡和一张银卡对象,初始化卡号、持卡人信息和初始余额。
  2. 分别为两张卡执行存款操作(用户输入存款金额)。
  3. 分别为两张卡执行消费操作(用户输入消费金额),展示不同卡片的折扣计算、余额更新及特色功能(如金卡的洗车票)。

二、实现以上功能的代码如下:

package Demo.pay;import java.util.Scanner;public class Test {/*** 实现加油站支付小程序的主流程* 1. 创建金卡和银卡对象* 2. 演示卡片的存款和消费功能*/public static void main(String[] args) {//目标:加油站支付小程序。//1、创建卡片类,以便创建金卡或银卡对象,封装车主的数据。//2、定义一个卡片父类:Card,定义金卡和银卡共有的属性和方法。//  定义一个金卡类,继承Card卡片类:GoldCard,金卡必须重写消费方法(8折优惠),独有功能打印车票。//  定义一个银卡类,继承Card卡片类:SilverCard,银卡必须重写消费方法(9折优惠)。//3、办一张金卡,创建金卡对象,交给一个独立的业务(支付机)来完成:存款,消费。//相关信息System.out.println("办一张金卡:");Card goldCard = new GoldCard("123456", "张三", "12345678901", 1000);System.out.println("金卡信息:" + goldCard);System.out.println("------------------------");//存款in(goldCard);System.out.println("------------------------");//消费pay(goldCard);System.out.println("================================================");//  办一张银卡,创建银卡对象,交给一个独立的业务(支付机)来完成:存款,消费。//相关信息System.out.println("办一张银卡:");Card silverCard = new SilverCard("123456", "王五", "12345678901", 5000);System.out.println("银卡信息:" + silverCard);System.out.println("------------------------");//存款in(silverCard);System.out.println("------------------------");//消费pay(silverCard);}/*** 存款机* 用于处理卡片存款业务,可以接受金卡或银卡进行存款操作** @param CardIn 卡片对象,可以是金卡或银卡*/public static void in(Card CardIn) {System.out.println("请输入存款金额:");Scanner sc = new Scanner(System.in);Double goldIn = sc.nextDouble();CardIn.preStore(goldIn);//存入System.out.println("当前余额为:" + CardIn.getMoney());}/*** 支付机* 用于处理卡片消费业务,可以接受金卡或银卡进行消费** @param card 卡片对象,可以是金卡或银卡*/public static void pay(Card card) {System.out.println("请输入消费金额:");Scanner sc = new Scanner(System.in);double money = sc.nextDouble();card.consume(money);//消费}
}
package Demo.pay;
//父类
//导包
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//lombok技术可以实现为类自动添加getter和setter方法
@Data //@Data注解会自动为类添加getter和setter方法
@AllArgsConstructor
@NoArgsConstructor/*** Card,定义金卡和银卡共有的属性和方法。* 包含卡的基本信息以及预存和消费功能*/
public class Card {private String carId;private String name;private String phone;private double money;/*** 预存金额到卡中* @param money 需要预存的金额*/public void preStore(double money) {this.money += money;}/*** 从卡中消费金额* @param money 需要消费的金额*/public void consume(double money) {this.money -= money;}
}

注意:lombok技术可以实现为类自动添加gettersetter方法……

步骤如下:

在 IntelliJ IDEA 中使用 Lombok@Data等注解时,通常按Alt+Enter就可以导入,但如果没有出现预期的创建选项,通常是因为 Lombok 相关配置不完整导致的。

可以按照以下步骤排查并解决:

1)设置

2)构建、执行、部署 -> 编译器 -> 注解处理器 -> 启用注解处理 -> 应用即可自动导包。

package Demo.pay;/*** 金卡类,继承自Card类* 金卡享有8折优惠,并且消费满200元可获得洗车票*/
public class GoldCard extends Card{/*** 金卡构造函数* @param carId 卡号* @param name 持卡人姓名* @param phone 持卡人电话* @param money 卡内余额*/public GoldCard(String carId, String name, String phone, double money) {super(carId, name, phone, money);}/*** 金卡消费方法,享受8折优惠* 如果余额不足则消费失败* 如果消费金额满200元则赠送洗车票* @param money 消费金额*/@Overridepublic void consume(double money) {System.out.println("您当前金卡消费:"+ money);System.out.println("优惠后的价格:"+ money * 0.8);if(getMoney()<money*0.8){System.out.println("您的余额是:"+ getMoney()+ ",余额不足!");return;}setMoney(getMoney()-money*0.8);System.out.println("您当前金卡余额为:"+ getMoney());//判断消费如果大于200,调用一个独有的功能,打印洗车票。if (money*0.8>=200){printTicket();}else {System.out.println("------------------------");System.out.println("您没有消费200元以上,没有洗车票");}}/*** 打印洗车票方法* 当消费满200元时调用此方法*/public void printTicket(){System.out.println("------------------------");System.out.println("恭喜您,获得一张洗车票");}
}
package Demo.pay;/*** 银卡类,继承自Card类* 用于处理银卡用户的消费逻辑,享受9折优惠*/
public class SilverCard extends Card{/*** 银卡构造函数* @param carId 卡号* @param name 持卡人姓名* @param phone 持卡人电话* @param money 初始金额*/public SilverCard(String carId, String name, String phone, double money){super(carId, name, phone, money);}/*** 银卡消费方法,享受9折优惠* @param money 消费金额*/@Overridepublic void consume(double money){System.out.println("您当前银卡消费:"+ money);System.out.println("优惠后的价格:"+ money * 0.9);// 检查余额是否充足if(getMoney()<money*0.9){System.out.println("您的余额是:"+ getMoney()+ ",余额不足!");return;}setMoney(getMoney()-money*0.9);System.out.println("您当前银卡余额为:"+ getMoney());//更新银卡的账号余额setMoney(getMoney()-money*0.9);}
}
http://www.dtcms.com/a/355623.html

相关文章:

  • 健永科技RFID技术在高压电厂机器狗巡检中的应用
  • Access token(访问令牌:以JWT格式无状态存储)和Refresh token(刷新令牌:有状态存储于Redis/DB)区别与联系、Redis黑名单
  • C#-mqtt通讯,服务端和客户端,以及esp32-mqtt
  • 第二十节:3D文本渲染 - 字体几何体生成与特效
  • 神经网络 | 基于matlab的LSTM详解
  • 3D高斯溅射实现医疗影像内部场景渲染
  • 【论文阅读】Object Detection in Adverse Weather for Autonomous Driving through Data Merging and YOLOv8
  • ConceptGraphs: Open-Vocabulary 3D Scene Graphs for Perception and Planning
  • 第八章:《性能优化技巧》——深入讲解预分配容量、移动语义、避免频繁拼接等优化策略,以及C++17的`string_view`如何减少拷贝开
  • 三电平逆变器SVPWM控制(无解耦功能)与谐波分析
  • gpt-5生成圆柱blockmesh脚本
  • UDS NRC24
  • 修改win11任务栏时间字体和小图标颜色
  • Graphpad Prism Mac医学绘图工具
  • GraphRAG技术深度解析:重新定义智能问答的未来
  • 数据结构初阶:详解顺序表OJ题
  • CUDA 矩阵分块乘法
  • Rust Web开发指南 第六章(动态网页模板技术-MiniJinja速成教程)
  • Docker 核心技术:Union File System
  • 知微集:梯度下降详解
  • 编写TreeMap自定义排序的插曲
  • 信号量使用流程
  • 多媒体内容智能检索技术进展
  • [特殊字符] ​​MySQL性能参数查询总结​
  • 146-延长无线传感器网络生命周期的睡眠调度机制的混合元启发式优化方法!
  • [RK3576][Android14] Android->添加以太网MAC地址选项
  • Spring Boot 实战:接入 DeepSeek API 实现问卷文本优化
  • FFmpeg 实战:从零开始写一个简易视频播放器
  • 视频层和叠加层
  • 数据结构:冒泡排序 (Bubble Sort)