上一篇我们通过面向过程实现了零钱通案例,
现在我们通过面向对象来实现,面向对象比面向过程要方便很多,在面向过程中,我们如果要增加一个功能的话比较繁琐,而在面向过程的时候,就会很方便,直接再添加一个方法即可,再创建其类的对象去调用即可,并且再面向对象中,我们还可以添加对象自己的信息进去。和上一篇要求一样,下面我们直接上代码:
package com.xiaowang.smaalChange.oop;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* @Author wanghaiyang
* id 201931101227
* @date 2021/11/28 15:01
*/
/*
存放零钱通的功能类,运用面向对象来编程
* */
public class SmallChangeSysOOP {
//属性:
boolean loop = true;
Scanner scanner = new Scanner(System.in);
double money = 0;//收益金额
double balance = 0;//余额
Date date = null;//格式中需要引进日期,下面是日期格式,在面向对象中,要引进java.util.Date包
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String reason = "";//消费原因
String details = "---------------零钱通明细----------------";
//在面向过程的代码中,各个功能就成为了面向对象的方法
//1、显示零钱通方法,显示菜单
public void menu() {
do {
System.out.println("============零钱通菜单============");
System.out.println("\t\t\t 1 零钱通明细");
System.out.println("\t\t\t 2 收益入账");
System.out.println("\t\t\t 3 消费");
System.out.println("\t\t\t 4 退出");
System.out.print("请选择(1-4)");
Scanner scanner = new Scanner(System.in);//得输入所要选择的功能
String key = scanner.next();//用key来保存所选择的功能
//接下来就是输出对应的功能咯
switch (key) {
//2 完成零钱通明细:选择(3):(1)可以把收益入账和消费存入数组 (2)可以使用对象 (3)直接使用String拼接
case "1":
this.details();//直接调用details()方法输出那句话,后面的功能直接拼接
break;
case "2":
this.income();
break;
case "3":
//4 完成零钱通消费,按照格式,需要一个字符串接收消费原因,一个变量消费金额
this.pay();
break;
case "4":
this.out();
break;
default:
System.out.println("您的输入有误请重新选择");
}
} while (loop);
}
//2、显示零钱通明细
public void details() {
System.out.println(details + "\n");//直接输出那句话,后面的功能直接拼接
return;//面向对象中用return来退出方法
}
//3、显示收益入账
public void income() {
//3 完成收益入账功能,根据输出格式肯定要引进收益和余额两个变量
//2.在收益和消费时,判断金额是否合理,并给出相应的提示
System.out.println("请输入你的收益金额:");
money = scanner.nextDouble();
//建议去判断不正确的用例,不正确就直接退出,正确就继续往下面走,要是判断值正确的还得把后面代码包括进去并且最后还要判断不正确金额时
if (money <= 0) {
System.out.println("金额输入有误,应该大于0");
return;
}
balance += money;
date = new Date();//定义一个date日期
//用字符串拼接收益信息
details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t余额" + balance;
}
//4、显示消费
public void pay() {
//4 完成零钱通消费,按照格式,需要一个字符串接收消费原因,一个变量消费金额
System.out.print("请输入消费原因");
reason = scanner.next();
System.out.print("请输入消费金额");
money = scanner.nextDouble();
//有一个范围校验
if (money <= 0 || money > balance) {
System.out.println("消费有误,消费金额应该在0-" + balance + "之间");
return;
}
balance -= money;
date = new Date();
//用字符串拼接消费信息
details += "\n\t" + reason + "\t-" + money + "\t" + sdf.format(date) + "\t余额" + balance;
}
//5、显示退出
public void out() {
//1.用户输入4退出时。给出提示”你确定要退出吗:y/n“,必须输入正确的y/n,否则循环输入指令,直到输入y或n。
String choice = "";//接收输入变量
//先判断是否输入的是y或者n,建议一段代码一个功能,方便更复杂的操作
while (true) {
System.out.println("你确定要退出吗:y/n");
choice = scanner.next();
if (choice.equals("y") || choice.equals("n")) {
break;
}
}
//退出while后,当输入y时,退出零钱通
if (choice.equals("y")) {
loop = false;
}
return;
}
}
输出一样:;
面向过程的代码可参考另外一篇零钱通案例----面向过程实现