黑马java学习笔记5(阶段一 第三章 06~第四章)阶段一 JavaSE完结

以下学习笔记记录于:2024.07.31-2024.08.06

阶段一 JavaSE基础

第三章 API基础

06 String应用案例:用户登录

image-20240731163128111

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);
    }
}

运行结果:

image-20240731162754102

总结:

image-20240731163022842

07 String应用案例:验证码

image-20240731163628121

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;
    }
}

运行结果:

image-20240731165018759

08 ArrayList集合的概述

集合是一种容器,用来装数据的,类似于数组。与数组不同的是,数组定义完之后长度就固定了,而集合大小可变,在开发中用得比较多。

public class ArrayList // 表示泛型类的意思,可以约束存储的数据类型。如果指定只能存int类型数据则可以写成ArrayList,若不写类型则可以存储任意类型的数据。

ArrayList的使用:创建对象,调用所提供的增删改查方法。

09 ArrayList集合的使用

image-20240731165702631

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);
    }
}

运行结果:

image-20240731181345083

10 ArrayList的应用案例:从容器中找出数据并删除

image-20240731181747409

// 目标:掌握从集合容器中找数据并删除的技巧
    /*  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);
    }
}

运行结果:

image-20240731213246223

注意bug:集合中删除一个数据后,后面的数据会全部向前移动

image-20240731213420555

11 ArrayList的综合案例:模仿外卖系统中的商家系统

image-20240731213737875

/*
*   目标:完成外卖系统中商家菜品管理中的菜品上架、菜品浏览功能。
*
*   菜品: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();
    }
}

运行结果:

image-20240731221156139

image-20240731221248669

第四章 综合案例:ATM项目

01 ATM项目介绍

实现相关功能:如登录注册、取款、存款、转账、查看账户信息、修改密码、注销账户、退出系统等。

image-20240802201806621

02 系统架构搭建、欢迎页面设计

image-20240802202257494

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();
    }
}

运行结果:

image-20240802203923409

03 开户功能

image-20240802205011371

image-20240802213617304

将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");
    }
}

运行结果:

image-20240802212358701

04 开户功能——生成新卡号

image-20240802220016971

image-20240802215948776

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;    // 查无此账户,这个卡号不存在
    }
}

运行结果:

image-20240802215838446

05 用户登录

image-20240806104022196

image-20240806105821219

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("您输入的密码不正确,请重新输入!!!");
                }
            }
        }
    }
	......

运行结果:

image-20240806110243526

image-20240806110259946

06 登录后的操作页展示、查询账户、退出

image-20240806111157975

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());
    }

    ......
}

运行结果:

image-20240806151208617

在这里插入图片描述

07 存款、取款

image-20240806194932418

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());
    }
    ......
}

运行结果:

image-20240806201223367

image-20240806201317772

image-20240806201404567

image-20240806201434870

08 转账

image-20240806202638961

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("对不起,您所输入的姓氏与对应卡号的用户姓氏不匹配");
                }
            }
        }
    }

    ......
}

运行结果:

image-20240806205130870

image-20240806205531842

image-20240806205600557

image-20240806205622842

image-20240806205655409

09 销户操作

image-20240806211605030

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;
        }
    }

   ......
}

运行结果:

image-20240806211808040

image-20240806211826542

10 修改密码

image-20240806213050424

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("您当前输入的密码不正确");
            }
        }
    }

    ......
}

运行结果:

image-20240806213139789

image-20240806213202649

image-20240806213219509

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();
    }
}
至此,阶段一 JavaSE基础学习完成!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值