目录
一、该代码主要实现以下功能:
1)类结构设计(基于继承关系)
- 父类
Card
:封装了所有卡片的共性属性(卡号carId
、持卡人姓名name
、电话phone
、余额money
)和基础功能(preStore
存款方法、consume
消费方法),通过 Lombok 的@Data
等注解自动生成 getter、setter 等方法。 - 子类
GoldCard
(金卡):继承Card
,重写consume
方法实现 8 折优惠,新增printTicket
方法(消费满 200 元赠送洗车票)。 - 子类
SilverCard
(银卡):继承Card
,重写consume
方法实现 9 折优惠。
2)核心业务功能
- 存款功能:通过
in
方法实现,支持用户输入存款金额,调用卡片的preStore
方法将金额存入卡内,并显示当前余额。 - 消费功能:通过
pay
方法实现,支持用户输入消费金额,根据卡片类型(金卡 / 银卡)自动应用对应折扣(8 折 / 9 折):- 金卡:消费时计算 8 折后金额,若余额不足则提示失败;若折后金额≥200 元,自动打印洗车票。
- 银卡:消费时计算 9 折后金额,若余额不足则提示失败。
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技术可以实现为类自动添加getter和setter方法……
步骤如下:
在 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 消费金额
*/
@Override
public 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 消费金额
*/
@Override
public 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);
}
}