以下学习笔记记录于:2024.07.31-2024.08.06
文章目录
阶段一 JavaSE基础
第三章 API基础
06 String应用案例:用户登录
import java.util.Scanner;
// 用户登录
public class StringLoginDemo {
public static void main(String[] args) {
// 只允许重复输入3次
for (int i = 0; i < 3; i++) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入登录名称:");
String loginName = sc.next();
System.out.println("请输入登录密码:");
String passWord = sc.next();
// 判断是否登录成功
boolean rs = login(loginName, passWord);
if (rs){
System.out.println("欢迎进入系统!!!");
break; // 登录完成,跳出for循环
}else {
System.out.println("登录名或密码错误,请重新确认---");
}
}
}
// 接收用户的登录名称和密码,返回认证的结果
public static boolean login(String loginName, String passWord) {
// 设置一组正确的登录名和密码
String okLoginName = "itheima";
String okPassWord = "123456";
/*if (okLoginName.equals(loginName) && okPassWord.equals(passWord)){
return true;
}else {
return false;
}*/
return okLoginName.equals(loginName) && okPassWord.equals(passWord);
}
}
运行结果:
总结:
07 String应用案例:验证码
import java.util.Random;
// 生成随机验证码
public class StringCreateCode {
public static void main(String[] args) {
System.out.println(createCode(4)); // 生成4位随机验证码
System.out.println(createCode(6)); // 生成6位随机验证码
}
public static String createCode(int n){
String code = ""; // 存储生成的随机验证码
String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
for (int i = 0; i < n; i++) {
int index = r.nextInt(data.length());
code += data.charAt(index);
}
return code;
}
}
运行结果:
08 ArrayList集合的概述
集合是一种容器,用来装数据的,类似于数组。与数组不同的是,数组定义完之后长度就固定了,而集合大小可变,在开发中用得比较多。
public class ArrayList // 表示泛型类的意思,可以约束存储的数据类型。如果指定只能存int类型数据则可以写成ArrayList,若不写类型则可以存储任意类型的数据。
ArrayList的使用:创建对象,调用所提供的增删改查方法。
09 ArrayList集合的使用
1、public boolean add(E e) :所返回的boolean值一般不用管,只需要用它对数据进行插入即可;
2、public boolean remove(Object o):若是删除一个集合中重复出现的数据,则默认删除第一次出现的符合数据。
import java.util.ArrayList;
// 掌握如何创建ArrayList集合的对象,并熟悉ArrayList提供的常用方法
public class ArrayListDemo {
public static void main(String[] args) {
// 创建一个ArrayList的集合对象
// ArrayList<String> list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<>(); // 推荐写法,从 jdk1.7 开始才支持
// 1. public boolean add(E e):将元素添加到此集合的末尾
list.add("黑马");
list.add("Java");
list.add("黑马");
System.out.println(list);
// 2. public void add(int index, E element):往集合中的某个索引位置处添加一个数据
list.add(1, "MySQL");
System.out.println(list);
// 3. public E get(int index):根据索引获取集合中某个索引位置处的值
String rs = list.get(1);
System.out.println(rs);
// 4. public int size():获取集合的大小(返回集合中存储的元素个数)
System.out.println(list.size());
System.out.println("-------------");
// 5. public E remove(int index):根据索引删除集合中的某个元素值,会返回被删除的元素值给我们
System.out.println(list.remove(1));
System.out.println(list);
System.out.println("-------------");
// 6. public boolean remove(Object o):直接删除某个元素值,删除成功会返回true,反之false
// 默认删除第一次出现的符合数据
System.out.println(list.remove("黑马"));
System.out.println(list);
System.out.println("-------------");
// 7. public E set(int index, E element):修改某个索引位置处的数据,修改后会返回原来的值给我们
System.out.println(list.set(1, "黑马程序员"));
System.out.println(list);
}
}
运行结果:
10 ArrayList的应用案例:从容器中找出数据并删除
// 目标:掌握从集合容器中找数据并删除的技巧
/* list.add("Java入门");
list.add("宁夏枸杞");
list.add("黑枸杞");
list.add("人字拖");
list.add("特级枸杞");
list.add("枸杞子");
*/
import java.util.ArrayList;
public class ArrayListDeleteText {
public static void main(String[] args) {
// 1. 创建一个ArrayList集合对象
ArrayList<String> list = new ArrayList<>();
list.add("Java入门");
list.add("宁夏枸杞");
list.add("黑枸杞");
list.add("人字拖");
list.add("特级枸杞");
list.add("枸杞子");
System.out.println(list);
// 2. 从集合中找出符合的数据并进行删除
/*
这一步有bug(运行结果如下)➡ bug代码已注释:
原集合:[Java入门, 宁夏枸杞, 黑枸杞, 人字拖, 特级枸杞, 枸杞子]
删除后:[Java入门, 黑枸杞, 人字拖, 枸杞子]
执行步骤:
当运行到 i=1 时,发现数据中包含“枸杞”,则将“宁夏枸杞”在集合中进行删除,并将全部数据向前挪一个位置来填补空缺。
这样就导致“黑枸杞”转移到了 i=1 的位置,但是此时经过 i++ 之后,是继续往后处理 i=2 位置的数据,这就导致了程序的bug。
(后面“枸杞子”数据未被删除的原因同上。)
*/
/* bug代码
for (int i = 0; i < list.size(); i++) {
String ele = list.get(i); // 取出当前遍历到的数据
if (ele.contains("枸杞")){ // 删除包含“枸杞”的数据
list.remove(ele);
}
}*/
// 解决方式1:每次删除一个数据后,就让i让左边退一步
/*for (int i = 0; i < list.size(); i++) {
String ele = list.get(i); // 取出当前遍历到的数据
if (ele.contains("枸杞")){ // 删除包含“枸杞”的数据
list.remove(ele);
i--; // 关键一步
}
}*/
// 解决方式2:从集合的后面倒着遍历并进行删除步骤
for (int i = list.size() - 1; i >= 0; i--) {
String ele = list.get(i); // 取出当前遍历到的数据
if (ele.contains("枸杞")){ // 删除包含“枸杞”的数据
list.remove(ele);
}
}
System.out.println(list);
}
}
运行结果:
注意bug:集合中删除一个数据后,后面的数据会全部向前移动
11 ArrayList的综合案例:模仿外卖系统中的商家系统
/*
* 目标:完成外卖系统中商家菜品管理中的菜品上架、菜品浏览功能。
*
* 菜品:Food (菜品名称name, 原价originalPrice, 优惠价specialPrice, 其他信息info)
* 菜品管理类 FoodManager (代表商家管理系统):展示操作的界面,提供菜品上架和菜品浏览功能
* 测试:ArrayListMerchant
*
* */
Food.java:
public class Food {
private String name;
private double originalPrice;
private double specialPrice;
private String info;
public Food() {
}
public Food(String name, double originalPrice, double specialPrice, String info) {
this.name = name;
this.originalPrice = originalPrice;
this.specialPrice = specialPrice;
this.info = info;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getOriginalPrice() {
return originalPrice;
}
public void setOriginalPrice(double originalPrice) {
this.originalPrice = originalPrice;
}
public double getSpecialPrice() {
return specialPrice;
}
public void setSpecialPrice(double specialPrice) {
this.specialPrice = specialPrice;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
FoodManager.java:
import java.util.ArrayList;
import java.util.Scanner;
public class FoodManager {
private ArrayList<Food> foods = new ArrayList<>();
private Scanner sc = new Scanner(System.in);
// 1. 商家上架菜品
public void add(){
System.out.println("======菜品上架======");
// 提前创建一个菜品对象,用于封装用户上架的菜品信息
Food food = new Food();
System.out.println("请输入需要上架菜品的名称:");
String name = sc.next();
food.setName(name);
System.out.println("请输入需要上架菜品的原价:");
double originalPrice = sc.nextDouble();
food.setOriginalPrice(originalPrice);
System.out.println("请输入需要上架菜品的优惠价:");
double specialPrice = sc.nextDouble();
food.setSpecialPrice(specialPrice);
System.out.println("请输入需要上架菜品的其他信息:");
String info = sc.next();
food.setInfo(info);
// 把菜品对象添加到集合容器中去
foods.add(food);
System.out.println("恭喜,新菜品上架成功!!!");
}
// 2. 菜品浏览功能
public void printAllFoods(){
System.out.println("====当前菜品信息如下====");
for (int i = 0; i < foods.size(); i++) {
Food food = foods.get(i);
System.out.println("菜品名称:" + food.getName());
System.out.println("菜品原价:" + food.getOriginalPrice());
System.out.println("菜品优惠价:" + food.getSpecialPrice());
System.out.println("菜品其他信息:" + food.getInfo());
System.out.println("----------------------------");
}
}
// 专门负责展示系统界面
public void start(){
while (true) {
System.out.println("===欢迎进入商家后台管理系统===");
System.out.println("1、上架菜品(add)");
System.out.println("2、浏览菜品(query)");
System.out.println("3、退出系统(exit)");
System.out.println("请您选择操作命令:");
String command = sc.next();
switch (command){
case "add":
add();
break;
case "query":
printAllFoods();
break;
case "exit":
return; // 结束当前方法
default:
System.out.println("您输入的命令有误,请重新输入~~~");
}
}
}
}
ArrayListMerchant.java:
public class ArrayListMerchant {
public static void main(String[] args) {
FoodManager manager = new FoodManager();
manager.start();
}
}
运行结果:
第四章 综合案例:ATM项目
01 ATM项目介绍
实现相关功能:如登录注册、取款、存款、转账、查看账户信息、修改密码、注销账户、退出系统等。
02 系统架构搭建、欢迎页面设计
Account.java:
// 定义系统关心的账户信息
public class Account {
private String cardId;
private String userName;
private char sex;
private String passWord;
private double money;
private double limit; // 限额
public Account() {
}
public Account(String cardId, String userName, char sex, String passWord, double money, double limit) {
this.cardId = cardId;
this.userName = userName;
this.sex = sex;
this.passWord = passWord;
this.money = money;
this.limit = limit;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
ATM.java:
import java.util.ArrayList;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>(); // 存储系统全部用户的账户信息
private Scanner sc = new Scanner(System.in);
/* 启动ATM系统 展示欢迎界面 */
public void start(){
while (true) {
System.out.println("===欢迎进入ATM系统===");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择想要操作的数字:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录
break;
case 2:
// 用户开户
break;
default:
System.out.println("输入操作命令有误,请重新确认");
}
}
}
}
ATMtest.java:
// 负责测试系统:创建ATM对象代表ATM系统并启动
public class ATMtest {
public static void main(String[] args) {
// 1. 创建一个ATM对象,代表ATM系统
ATM atm = new ATM();
// 2. 调用ATM对象的start方法来启动系统
atm.start();
}
}
运行结果:
03 开户功能
将Account.java中的getUserName()方法修改一下:
public String getUserName() {
return userName + ( sex == '女' ? "女士" : "先生" );
}
ATM.java添置如下:
package com.itheima.JavaBean.ATM;
import java.util.ArrayList;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>(); // 存储系统全部用户的账户信息
private Scanner sc = new Scanner(System.in);
/* 启动ATM系统 展示欢迎界面 */
public void start(){
while (true) {
System.out.println("===欢迎进入ATM系统===");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择想要操作的数字:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("输入操作命令有误,请重新确认");
}
}
}
/* 完成用户开户操作 */
private void createAccount() {
// 1. 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2. 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0);
if (sex == '男' || sex == '女'){
account.setSex(sex);
break;
}else {
System.out.println("您输入的性别有误,请输入“男/女");
}
}
while (true) {
System.out.println("请您输入您的账户密码:");
String passWord = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassWord = sc.next();
// 判断两次输入的密码是否一致
if (okPassWord.equals(passWord)){
account.setPassWord(okPassWord);
break;
}else {
System.out.println("您输入的2次密码不一致,请您确认!!!");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点:为这个账户生成一个卡号(由系统自动生成8位数字表示,不与其他账户卡号重复,在下节课详细讲解)
// 3. 把这个账户对象,存入到账户集合中去
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:XXXXXXXX");
}
}
运行结果:
04 开户功能——生成新卡号
ATM.java添置如下:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
......
/* 完成用户开户操作 */
private void createAccount() {
......
// 重点:为这个账户生成一个卡号(由系统自动生成8位数字表示,不与其他账户卡号重复,在这节课详细讲解)
String newCardId = createCardId();
account.setCardId(newCardId);
// 3. 把这个账户对象,存入到账户集合中去
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
/* 返回一个8位数字的卡号,而且这个卡号不能与其他账户的卡号重复 */
private String createCardId() {
while (true) {
// 1. 定义一个String类型的变量记住8位数字作为一个卡号
String cardId = "";
// 2. 使用循环,循环8次,每次产生一个随机数给cardId连接起来
Random r = new Random();
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10);
cardId += data;
}
// 3. 判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复的才可以作为一个新卡号进行返回
Account acc = getAccountByCardId(cardId);
if (acc == null){
// 说明根据cardId没有找到对应的账户对象,因此没有与其他卡号重复,可以将它返回作为一个新卡号
return cardId;
}
}
}
/* 根据卡号查询账户对象返回 accounts = [c1, c2, ……] */
private Account getAccountByCardId(String cardId) {
// 遍历全部的账户对象
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象acc中的卡号是否是我们要找的卡号
if (acc.getCardId().equals(cardId)){
return acc;
}
}
return null; // 查无此账户,这个卡号不存在
}
}
运行结果:
05 用户登录
ATM.java添置如下:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
......
/* 启动ATM系统 展示欢迎界面 */
public void start(){
while (true) {
......
switch (command){
case 1:
// 用户登录
login();
break;
......
}
}
}
/* 完成用户的登录操作 */
private void login(){
System.out.println("==系统登录==");
// 1. 判断系统中是否存在账户对象,存在才能进行登录操作,否则没必要登录
if (accounts.size() == 0){
System.out.println("当前系统中无任何账户,请先开户再来登录~~");
return; // 跳出登录操作
}
// 2. 系统中存在账户对象,可以开始进行登录操作
while (true) {
System.out.println("请您输入您的登录卡号:");
String cardId = sc.next();
// 3. 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if (acc == null){
// 说明这个卡号不存在
System.out.println("您输入的登录卡号不存在,请确认!!!");
}else {
// 卡号存在,让用户输入密码
System.out.println("请您输入登录密码:");
String passWord = sc.next();
// 4. 判断密码是否正确
if (acc.getPassWord().equals(passWord)){
System.out.println("恭喜您," + acc.getUserName() + "成功登录了系统,您的卡号是:" + acc.getCardId());
// 此处有登录之后的操作内容,在之后课程中逐一讲解
}else {
System.out.println("您输入的密码不正确,请重新输入!!!");
}
}
}
}
......
运行结果:
06 登录后的操作页展示、查询账户、退出
ATM.java添置如下:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
......
private Account loginAcc; // 记住登录后的用户账户
......
/* 完成用户的登录操作 */
private void login(){
......
// 2. 系统中存在账户对象,可以开始进行登录操作
while (true) {
......
if (acc == null){
......
}else {
......
if (acc.getPassWord().equals(passWord)){
// 密码正确,登录成功
loginAcc = acc;
System.out.println("恭喜您," + acc.getUserName() + "成功登录了系统,您的卡号是:" + acc.getCardId());
// 此处有登录之后的操作内容,本节课讲解:展示登录后的操作界面
showUserCommand();
return; // 跳出并结束当前登录方法,回到欢迎界面start()
}else {
System.out.println("您输入的密码不正确,请重新输入!!!");
}
}
}
}
/* 展示登录后的操作界面 */
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + ",您可以选择如下功能进行账户的处理====");
System.out.println("1、查询账户");
System.out.println("2、存款");
System.out.println("3、取款");
System.out.println("4、转账");
System.out.println("5、密码修改");
System.out.println("6、退出");
System.out.println("7、注销当前账户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command){
case 1:
// 查询当前登录的账户信息
showLoginAccount();
break;
case 2:
// 存款
break;
case 3:
// 取款
break;
case 4:
// 转账
break;
case 5:
// 密码修改
break;
case 6:
// 退出
System.out.println(loginAcc.getUserName() + ",您退出系统成功!");
return; // 跳出并结束当前方法
case 7:
// 注销当前账户
break;
default:
System.out.println("无此操作命令,请重新确认!!!");
}
}
}
/* 展示当前登录的账户信息 */
private void showLoginAccount() {
System.out.println("==当前您的账户信息如下==");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
......
}
运行结果:
07 存款、取款
ATM.java添置如下:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
......
/* 展示登录后的操作界面 */
private void showUserCommand(){
while (true) {
......
switch (command){
......
case 2:
// 存款
depositMoney();
break;
case 3:
// 取款
drawMoney();
break;
......
}
}
}
/* 取款 */
private void drawMoney() {
System.out.println("==取款操作==");
// 1. 判断账户余额是否大于等于100元,若不够则不能进行取款操作
if (loginAcc.getMoney() < 100){
System.out.println("您的账户余额不足100元,不允许取款");
return;
}
// 2. 让用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money = sc.nextDouble();
// 3. 判断账户余额是否足够
if (loginAcc.getMoney() >= money){
// 当账户余额充足时,需要判断是否超过取现额度
if (money > loginAcc.getLimit()){
System.out.println("您当前取款金额超过取现额度,您每次最多可取:" + loginAcc.getLimit());
}else {
// 可以进行取款,并更新账户余额
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您已成功取款" + money +"元,现账户余额为:" + loginAcc.getMoney());
break;
}
}else {
System.out.println("余额不足,您的账户余额为:" + loginAcc.getMoney());
}
}
}
/* 存款 */
private void depositMoney() {
System.out.println("==存款操作==");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
// 更新当前登录账户的余额
loginAcc.setMoney(loginAcc.getMoney() + money);
System.out.println("成功存入" + money + "元,存入后余额为:" + loginAcc.getMoney());
}
......
}
运行结果:
08 转账
ATM.java添置如下:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
......
/* 展示登录后的操作界面 */
private void showUserCommand(){
while (true) {
......
switch (command){
......
case 4:
// 转账
transferMoney();
break;
......
}
}
}
/* 转账 */
private void transferMoney() {
System.out.println("==用户转账==");
// 1. 判断系统中是否存在其他账户
if (accounts.size() < 2){
System.out.println("当前系统中只有您一个账户,无法为其他账户转账!");
return;
}
// 2. 判断自己的账户是否有余额
if (loginAcc.getMoney() == 0){
System.out.println("当前您的账户余额为0,请充值后再进行转账!");
return;
}
// 3. 开始转账
while (true) {
System.out.println("请您输入对方的卡号:");
String cardId = sc.next();
// 4. 判断对方卡号是否存在
Account acc = getAccountByCardId(cardId);
if (acc == null){
System.out.println("您输入的需要转帐的卡号不存在,请确认");
}else {
// 对方账户存在,需要继续认证对方的姓氏
String name = "*" + acc.getUserName().substring(1); // 黑马刘德华 ➡ *马刘德华
System.out.println("请您输入【" + name + "】的姓氏");
String preName = sc.next();
if (acc.getUserName().startsWith(preName)){
while (true) {
System.out.println("请您输入转账金额:");
double money = sc.nextDouble();
// 判断转账金额是否超过账户余额
if (loginAcc.getMoney() >= money){
// 正式转账给对方,并对账户余额进行更新
loginAcc.setMoney(loginAcc.getMoney() - money);
// 更新对方账户余额
acc.setMoney(acc.getMoney() + money);
System.out.println("您已成功转账" + money + "元,现账户余额为:" + loginAcc.getMoney());
return; // 退出转账方法
}else {
System.out.println("您的账户余额不足,现余额为:" + loginAcc.getMoney());
}
}
}else {
System.out.println("对不起,您所输入的姓氏与对应卡号的用户姓氏不匹配");
}
}
}
}
......
}
运行结果:
09 销户操作
ATM.java添置如下:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
......
/* 展示登录后的操作界面 */
private void showUserCommand(){
while (true) {
......
switch (command){
......
case 7:
// 注销当前账户
if (deleteAccount()){
// 销户成功,回到欢迎页
return;
}
break;
......
}
}
}
/* 注销当前账户
* 若销户成功则返回欢迎页,否则返回用户操作页,此处用boolean来标记
*/
private boolean deleteAccount() {
System.out.println("==销户操作==");
// 1. 询问用户是否确认销户,防止用户误触的情况
System.out.println("请问您确认销户吗?y/n");
String command = sc.next();
switch (command){
case "y":
// 2. 判断用户账户余额是否有存款
if (loginAcc.getMoney() == 0){
accounts.remove(loginAcc);
System.out.println("您的账户已成功销户!!!");
return true;
}else {
System.out.println("对不起,您的账户还有余额,暂不允许销户");
return false;
}
default:
System.out.println("好的,系统将保留您的账户!");
return false;
}
}
......
}
运行结果:
10 修改密码
ATM.java添置如下:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
......
/* 展示登录后的操作界面 */
private void showUserCommand(){
while (true) {
......
switch (command){
......
case 5:
// 密码修改
updatePassWord();
return; // 修改密码成功,回到欢迎页
......
}
}
}
/* 密码修改 */
private void updatePassWord() {
System.out.println("==账户密码修改操作==");
while (true) {
// 1. 提醒用户认证当前密码
System.out.println("请您输入当前账户的密码:");
String passWord = sc.next();
// 2. 认证当前密码是否正确
if (loginAcc.getPassWord().equals(passWord)){
while (true) {
// 3. 开始修改密码
System.out.println("请您输入新密码:");
String newPassWord = sc.next();
System.out.println("请您再次确认密码:");
String okPassWord = sc.next();
// 判断2次密码是否一致
if (okPassWord.equals(newPassWord)){
loginAcc.setPassWord(okPassWord);
System.out.println("恭喜您,密码修改成功!!!");
return;
}else {
System.out.println("您输入的2次密码不一致");
}
}
}else {
System.out.println("您当前输入的密码不正确");
}
}
}
......
}
运行结果:
ATM项目代码整合
Account.java:
// 定义系统关心的账户信息
public class Account {
private String cardId;
private String userName;
private char sex;
private String passWord;
private double money;
private double limit; // 限额
public Account() {
}
public Account(String cardId, String userName, char sex, String passWord, double money, double limit) {
this.cardId = cardId;
this.userName = userName;
this.sex = sex;
this.passWord = passWord;
this.money = money;
this.limit = limit;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName + ( sex == '女' ? "女士" : "先生" );
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
ATM.java:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
// 代表ATM系统,负责处理账户相关的业务需求
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>(); // 存储系统全部用户的账户信息
private Scanner sc = new Scanner(System.in);
private Account loginAcc; // 记住登录后的用户账户
/* 启动ATM系统 展示欢迎界面 */
public void start(){
while (true) {
System.out.println("===欢迎进入ATM系统===");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择想要操作的数字:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录
login();
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("输入操作命令有误,请重新确认");
}
}
}
/* 完成用户的登录操作 */
private void login(){
System.out.println("==系统登录==");
// 1. 判断系统中是否存在账户对象,存在才能进行登录操作,否则没必要登录
if (accounts.size() == 0){
System.out.println("当前系统中无任何账户,请先开户再来登录~~");
return; // 跳出登录操作
}
// 2. 系统中存在账户对象,可以开始进行登录操作
while (true) {
System.out.println("请您输入您的登录卡号:");
String cardId = sc.next();
// 3. 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if (acc == null){
// 说明这个卡号不存在
System.out.println("您输入的登录卡号不存在,请确认!!!");
}else {
// 卡号存在,让用户输入密码
System.out.println("请您输入登录密码:");
String passWord = sc.next();
// 4. 判断密码是否正确
if (acc.getPassWord().equals(passWord)){
// 密码正确,登录成功
loginAcc = acc;
System.out.println("恭喜您," + acc.getUserName() + "成功登录了系统,您的卡号是:" + acc.getCardId());
// 此处有登录之后的操作内容,本节课讲解:展示登录后的操作界面
showUserCommand();
return; // 跳出并结束当前登录方法,回到欢迎界面start()
}else {
System.out.println("您输入的密码不正确,请重新输入!!!");
}
}
}
}
/* 展示登录后的操作界面 */
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + ",您可以选择如下功能进行账户的处理====");
System.out.println("1、查询账户");
System.out.println("2、存款");
System.out.println("3、取款");
System.out.println("4、转账");
System.out.println("5、密码修改");
System.out.println("6、退出");
System.out.println("7、注销当前账户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command){
case 1:
// 查询当前登录的账户信息
showLoginAccount();
break;
case 2:
// 存款
depositMoney();
break;
case 3:
// 取款
drawMoney();
break;
case 4:
// 转账
transferMoney();
break;
case 5:
// 密码修改
updatePassWord();
return; // 修改密码成功,回到欢迎页
case 6:
// 退出
System.out.println(loginAcc.getUserName() + ",您退出系统成功!");
return; // 跳出并结束当前方法
case 7:
// 注销当前账户
if (deleteAccount()){
// 销户成功,回到欢迎页
return;
}
break;
default:
System.out.println("无此操作命令,请重新确认!!!");
}
}
}
/* 密码修改 */
private void updatePassWord() {
System.out.println("==账户密码修改操作==");
while (true) {
// 1. 提醒用户认证当前密码
System.out.println("请您输入当前账户的密码:");
String passWord = sc.next();
// 2. 认证当前密码是否正确
if (loginAcc.getPassWord().equals(passWord)){
while (true) {
// 3. 开始修改密码
System.out.println("请您输入新密码:");
String newPassWord = sc.next();
System.out.println("请您再次确认密码:");
String okPassWord = sc.next();
// 判断2次密码是否一致
if (okPassWord.equals(newPassWord)){
loginAcc.setPassWord(okPassWord);
System.out.println("恭喜您,密码修改成功!!!");
return;
}else {
System.out.println("您输入的2次密码不一致");
}
}
}else {
System.out.println("您当前输入的密码不正确");
}
}
}
/* 注销当前账户
* 若销户成功则返回欢迎页,否则返回用户操作页,此处用boolean来标记
*/
private boolean deleteAccount() {
System.out.println("==销户操作==");
// 1. 询问用户是否确认销户,防止用户误触的情况
System.out.println("请问您确认销户吗?y/n");
String command = sc.next();
switch (command){
case "y":
// 2. 判断用户账户余额是否有存款
if (loginAcc.getMoney() == 0){
accounts.remove(loginAcc);
System.out.println("您的账户已成功销户!!!");
return true;
}else {
System.out.println("对不起,您的账户还有余额,暂不允许销户");
return false;
}
default:
System.out.println("好的,系统将保留您的账户!");
return false;
}
}
/* 转账 */
private void transferMoney() {
System.out.println("==用户转账==");
// 1. 判断系统中是否存在其他账户
if (accounts.size() < 2){
System.out.println("当前系统中只有您一个账户,无法为其他账户转账!");
return;
}
// 2. 判断自己的账户是否有余额
if (loginAcc.getMoney() == 0){
System.out.println("当前您的账户余额为0,请充值后再进行转账!");
return;
}
// 3. 开始转账
while (true) {
System.out.println("请您输入对方的卡号:");
String cardId = sc.next();
// 4. 判断对方卡号是否存在
Account acc = getAccountByCardId(cardId);
if (acc == null){
System.out.println("您输入的需要转帐的卡号不存在,请确认");
}else {
// 对方账户存在,需要继续认证对方的姓氏
String name = "*" + acc.getUserName().substring(1); // 黑马刘德华 ➡ *马刘德华
System.out.println("请您输入【" + name + "】的姓氏");
String preName = sc.next();
if (acc.getUserName().startsWith(preName)){
while (true) {
System.out.println("请您输入转账金额:");
double money = sc.nextDouble();
// 判断转账金额是否超过账户余额
if (loginAcc.getMoney() >= money){
// 正式转账给对方,并对账户余额进行更新
loginAcc.setMoney(loginAcc.getMoney() - money);
// 更新对方账户余额
acc.setMoney(acc.getMoney() + money);
System.out.println("您已成功转账" + money + "元,现账户余额为:" + loginAcc.getMoney());
return; // 退出转账方法
}else {
System.out.println("您的账户余额不足,现余额为:" + loginAcc.getMoney());
}
}
}else {
System.out.println("对不起,您所输入的姓氏与对应卡号的用户姓氏不匹配");
}
}
}
}
/* 取款 */
private void drawMoney() {
System.out.println("==取款操作==");
// 1. 判断账户余额是否大于等于100元,若不够则不能进行取款操作
if (loginAcc.getMoney() < 100){
System.out.println("您的账户余额不足100元,不允许取款");
return;
}
// 2. 让用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money = sc.nextDouble();
// 3. 判断账户余额是否足够
if (loginAcc.getMoney() >= money){
// 当账户余额充足时,需要判断是否超过取现额度
if (money > loginAcc.getLimit()){
System.out.println("您当前取款金额超过取现额度,您每次最多可取:" + loginAcc.getLimit());
}else {
// 可以进行取款,并更新账户余额
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您已成功取款" + money +"元,现账户余额为:" + loginAcc.getMoney());
break;
}
}else {
System.out.println("余额不足,您的账户余额为:" + loginAcc.getMoney());
}
}
}
/* 存款 */
private void depositMoney() {
System.out.println("==存款操作==");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
// 更新当前登录账户的余额
loginAcc.setMoney(loginAcc.getMoney() + money);
System.out.println("成功存入" + money + "元,存入后余额为:" + loginAcc.getMoney());
}
/* 展示当前登录的账户信息 */
private void showLoginAccount() {
System.out.println("==当前您的账户信息如下==");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
/* 完成用户开户操作 */
private void createAccount() {
// 1. 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2. 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0);
if (sex == '男' || sex == '女'){
account.setSex(sex);
break;
}else {
System.out.println("您输入的性别有误,请输入“男/女");
}
}
while (true) {
System.out.println("请您输入您的账户密码:");
String passWord = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassWord = sc.next();
// 判断两次输入的密码是否一致
if (okPassWord.equals(passWord)){
account.setPassWord(okPassWord);
break;
}else {
System.out.println("您输入的2次密码不一致,请您确认!!!");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点:为这个账户生成一个卡号(由系统自动生成8位数字表示,不与其他账户卡号重复,在下节课详细讲解)
String newCardId = createCardId();
account.setCardId(newCardId);
// 3. 把这个账户对象,存入到账户集合中去
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
/* 返回一个8位数字的卡号,而且这个卡号不能与其他账户的卡号重复 */
private String createCardId() {
while (true) {
// 1. 定义一个String类型的变量记住8位数字作为一个卡号
String cardId = "";
// 2. 使用循环,循环8次,每次产生一个随机数给cardId连接起来
Random r = new Random();
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10);
cardId += data;
}
// 3. 判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复的才可以作为一个新卡号进行返回
Account acc = getAccountByCardId(cardId);
if (acc == null){
// 说明根据cardId没有找到对应的账户对象,因此没有与其他卡号重复,可以将它返回作为一个新卡号
return cardId;
}
}
}
/* 根据卡号查询账户对象返回 accounts = [c1, c2, ……] */
private Account getAccountByCardId(String cardId) {
// 遍历全部的账户对象
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象acc中的卡号是否是我们要找的卡号
if (acc.getCardId().equals(cardId)){
return acc;
}
}
return null; // 查无此账户,这个卡号不存在
}
}
ATMtest.java:
// 负责测试系统:创建ATM对象代表ATM系统并启动
public class ATMtest {
public static void main(String[] args) {
// 1. 创建一个ATM对象,代表ATM系统
ATM atm = new ATM();
// 2. 调用ATM对象的start方法来启动系统
atm.start();
}
}