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

发布于:2025-08-29 ⋅ 阅读:(11) ⋅ 点赞:(0)

目录

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

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


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

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 消费金额
     */
    @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);
    }
}