Java零基础学习Day09——加油站支付小模块(阶段性总结和训练)

问题:加油站支付小模块

  • 某加油站为了吸引更多的车主,推出了如下活动
  • 车主可以办理金卡和银卡
  • 卡片信息包括:车牌号码,车主姓名,电话号码,卡片余额
  • 金卡办理时入存金额必须>=5000元,金卡支付享受8折优惠,且消费满200元可以提供洗车服务
  • 银卡办理时入存金额必须>=2000元,银卡支付享受9折优惠
  • 需求:请使用面向对象编程,完成该加油站支付机的存款和消费程序

Text.java

package com.itheima.demo;

import java.util.Scanner;

public class Text {
    public static void main(String[] args) {
        //目标:加油站支付小程序
        //1.城建卡片类,以便创建金卡或者银卡对象,封装车主的数据
        //2.定义一个卡片父类:Card,定义一个金卡和银卡的共同属性和方法
        //3.定义一个金卡类,继承Card类,金卡必须重写消费方法(8折优惠)及独有功能打印洗车票
        GoldCard goldCard = new GoldCard("01","张三",1380000001,1000);
        //3.定义一个银卡类,继承Card类,银卡必须重写消费方法(9折优惠)
        SilverCard silverCard = new SilverCard("02","李四",1380000002,2000);
        //4。办一张金卡,创建金卡对象,交给一个独立的业务:存款,消费,
        //5.办一张银卡,创建银卡对象,交给一个独立的业务:存款,消费
        pay(silverCard);
        pay(goldCard);


    }
    //pay()方法定义在main()方法外面,Java中不允许在方法内部嵌套定义方法
    public static void pay(Card c){
        System.out.println("请输入消费金额:");
        Scanner sc = new Scanner(System.in);
        double money = sc.nextDouble();
        c.consume(money);
    }
}

Card.java

import lombok.Data;
import lombok.NoArgsConstructor;

// @Data注解可以自动生成getter和setter方法,无参数构造器,toString方法等
@Data
@AllArgsConstructor  //自动构造有参构造器
@NoArgsConstructor //自动构造无参构造器
public class Card {
    private String carId ;
    private String name ;
    private double phone;
    private double money;

    //预存金额
    public void deposit(double money){
        this.money += money;
    }

    //消费金额
    public void consume(double money){
        this.money -= money;
    }
}

GoldCard.java

package com.itheima.demo;

public class GoldCard extends Card{
    public GoldCard(String carId, String name, double phone, int money) {
        super(carId, name, phone, 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("余额不足");
            return;//干掉方法
        }

        //更新金卡的账户余额,用set进行修改,get进行获取
        setMoney(getMoney()-money*0.8);
        //判断消费如果大于200,调用一个独有的功能,打印洗车票
        if(money * 0.8 >= 200){
            printWashCarTicket();
        }else {
            System.out.println("没有消费200元以上,没有洗车票");
        }
    }
    //打印洗车票
    public void printWashCarTicket(){
        System.out.println("您已获得一张金卡洗车券");
    }
}

SilverCard.java

package com.itheima.demo;

public class SilverCard extends  Card {
    public SilverCard(String carId,String name, double phone, int money) {
        super(carId, name, phone, money);//调用父类有参构造器
    }

    @Override
    public void consume(double money) {
        System.out.println("您当前银卡消费:" + money);
        System.out.println("优惠后的价格是:" + money * 0.9);
        setMoney(getMoney() - money * 0.9);
        if (getMoney()<money*0.9){
            System.out.println("余额不足");
            return; //干掉方法
        }

    }


}

过程中遇到的问题

方法嵌套定义:在Text.java中方法定义位置错误,pay() 方法定义在 main() 方法内部,Java 中不允许在方法内部嵌套定义方法。

构造器继承问题:GoldCard 和 SilverCard 构造器未调用父类构造器。

参数类型不匹配:父类 Card 的属性为 carId(String)、phone(String),而子类构造器参数中 phone 被定义为 double 或 int,且参数名 card 与父类 carId 不匹配。

总结

这个小项目结合了之前学过的封装,继承,多态等知识,第一遍先跟着课程敲一遍,理解里面的业务逻辑,后续要自己尝试重新多去敲几遍,巩固之前学过的知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值