Java零基础笔记09(Java编程核心:面向对象编程高级练习:支付模块)
加油站支付小模块
● 某加油站为了吸引更多的车主,推出了如下活动,车主可以办理金卡和银卡。
● 卡片信息包括:车牌号码、车主姓名、电话号码、卡片余额。
● 金卡办理时入存金额必须>=5000元,银卡办理时预存金额必须>=2000元,金卡支付时享受8折优惠,银卡支付时享受9折优惠,金卡消费满200元可以提供打印免费洗车票的服务。 ● 需求:请使用面向对象编程,完成该加油站支付机的存款和消费程序。
card类
// lombok技术可以实现为类自动添加getter setter方法
@Data // @Data注解可以自动生成getter setter方法
@NoArgsConstructor
@AllArgsConstructor
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;}
}
金卡类
public class GoldCard extends Card{public GoldCard(String card, String name, String phone, double money) {super(card, name, phone, money);}@Overridepublic void consume(double money) {System.out.println("您当前消费:" + money);System.out.println("优惠后的价格:" + money * 0.8);// 更新金卡的账户余额。setMoney(getMoney() - money * 0.8);if(getMoney() < money * 0.8){System.out.println("您余额是:" + getMoney() + ",当前余额不足!请存钱!");return; // 干掉方法!}// 判断消费如果大于200,调用一个独有的功能,打印洗车票。if(money * 0.8 >= 200){printTicket();}else {System.out.println("您当前消费不满200,不能免费洗车!");}}// 打印洗车票。public void printTicket() {System.out.println("您消费了,请打印洗车票。");}
}
银卡类
public class SilverCard extends Card{public GoldCard(String card, String name, String phone, double money) {super(card, 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("您余额是:" + getMoney() + ",当前余额不足!请存钱!");return; // 干掉方法!}// 更新金卡的账户余额。setMoney(getMoney() - money * 0.9);}
}
主程序
// 主程序
public static void main(String[] args) {// 目标:加油站支付小程序。// 1、创建卡片类,以便创建金卡或者银卡对象,封装车主的数据。// 2、定义一个卡片父类:Card,定义金卡和银卡的共同属性和方法。// 3、定义一个金卡类,继承Card类:金卡必须重写消费方法(8折优惠),独有功能打印洗车票。// 4、定义一个银卡类,继承Card类:银卡必须重写消费方法(9折优惠)// 5、办一张金卡:创建金卡对象。交给一个独立的业务(支付机)来完成:存款,消费。GoldCard goldCard = new GoldCard( "鄂A860MM", "dLei", "18665616520", 5000);pay(goldCard);// 6、办一张银卡:创建银卡对象。交给一个独立的业务(支付机)来完成:存款,消费。SilverCard silverCard = new SilverCard( "粤A888888", "dLei", "18984724244", 2000);pay(silverCard);
}// 支付机,用一个方法来刷卡,可能接收金卡,也可能接收银卡。
public static void pay(Card c){System.out.println("请刷卡, 请您输入当前消费的金额:");Scanner sc = new Scanner(System.in);double money = sc.nextDouble();c.consume(money);
}