一、Java中的内存分配
. Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 栈存储局部变量( 变量 ) 堆存储new出来的东西( 引用类型 )
方法区(后面讲) 本地方法区(和系统相关)
寄存器(给CPu使用)
栈内存的数据用完就立即释放
堆内存的特点:
-
每一个new 出来的对象 , 都地址值
-
每个变量都有默认值
byte, short , int ,long 默认值 0
float, double 默认0.0
char '\u0000'
boolean false
引用类型 null
-
使用完毕后就会变成垃级, 但并不会立即进行回收,等垃级回收器空闲了,才进行回收
二、API
API(Application Programming Interface),应用程序编程接口。Java API是一本程序员的 字典 ,是JDK中提供给我们使用的类的说明文档。这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可。所以我们可以通过查询API的方式,来学习Java提供的类,并得知如何使用它们。
三、equals 与 ==
”==" 既可以作用在基本数据类型中,也可以作用在引用数据类型中
equals()只能作用在引用数据类型(两个对象),无法作用在基本数据类型
"== 作用在基本数据类型时比较的的是值是否相同,作用在引用数据类型时比较的是两个对象的地址值是否一致(是否指向相同对象)
equals()方法在不重写的情况下调用的是"=="也就是比较两个对象的地址值是否一致,但是equals()是可以重写的,如果重写后具体对比的含义根据重写规则而定
三、字符串与整型的转换
对应包装类.parseXX(字符串) ;
ATM 机实现
要求
步骤:
使用数组存储用户的信息( 管理员,用户)
显示欢迎界面,并提供登录操作
输入用户名和密码,进行登录 , 判断 否是管理员
如果是管理员
a: 管理员登录 , 显示管理员的欢迎界面,及菜单选择
开卡 2 注销卡 3. 查看所有用户列表 4 冻结账号 5. 返回登录界面 6 退出系统
开卡
提示输入卡号
判断是这个卡号是否已经存在
不存在,进行提示输入密码
把这个新对象,加入到用户数组 (扩容 )
注销卡:
提示输入卡号
这个卡号是否已经存在
卡号存在,记录它的下标位置
删除这个对象(缩容)
查看所有用户列表
遍历数组,且进行输出
冻结账号
提示输入卡号
这个卡号是否已经存在
卡号存在,记录它的下标位置
将对应下标位置的状态,改为冻结
否则认为是用户登录
判断用户数组中,是数据 是否与输入相等
相等,登录成功
显示菜单界面,欢迎xxxx ,
1. 查看余额 2. 存钱 3. 取钱 4. 转账 5.退出
不相等,登录失败
代码实现
import java.util.Scanner;
public class ATM {
public static void main(String[] args) {
/*
* 步骤:
1. 使用数组存储用户的信息( 管理员,用户)
2. 显示欢迎界面,并提供登录操作
3. 输入用户名和密码,进行登录 , 判断 否是管理员
4. 如果是管理员
a: 管理员登录 , 显示管理员的欢迎界面,及菜单选择
1. 开卡 2 注销卡 3. 查看所有用户列表 4 冻结账号 5. 返回登录界面 6 退出系统
开卡
提示输入卡号
判断是这个卡号是否已经存在
不存在,进行提示输入密码
把这个新对象,加入到用户数组 (扩容 )
注销卡:
提示输入卡号
这个卡号是否已经存在
卡号存在,记录它的下标位置
删除这个对象(缩容)
查看所有用户列表
遍历数组,且进行输出
冻结账号
提示输入卡号
这个卡号是否已经存在
卡号存在,记录它的下标位置
将对应下标位置的状态,改为冻结
5. 否则认为是用户登录
判断用户数组中,是数据 是否与输入相等
相等,登录成功
显示菜单界面,欢迎xxxx ,
1. 查看余额 2. 存钱 3. 取钱 4. 转账 5.退出
不相等,登录失败
* */
/**
* 1. 使用数组存储用户的信息( 管理员,用户)
*/
// 管理员数组 用户名 密码
String[] Admin = {"admin", "123"};
//用户数组 用户名 密码 余额 状态
String[] user1 = {"user1", "123", "2000", "正常"};
String[] user2 = {"user2", "123", "3000", "正常"};
String[] user3 = {"user3", "123", "4000", "正常"};
String[] user4 = {"user4", "123", "5000", "正常"};
String[] user5 = {"user5", "123", "26000", "冻结"};
//所有用户存在这里
String[][] AllUser = {user1, user2, user3, user4, user5};
/**
* 2. 显示欢迎界面,并提供登录操作
*/
//do是管理员返回登录的循环
do {
System.out.println("欢迎来到本ATM系统!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String inputName = scanner.nextLine();
System.out.println("请输入密码:");
String inputPwd = scanner.nextLine();
//管理员登录 , 显示管理员的欢迎界面,及菜单选择
if (inputName.equals(Admin[0])) {
if (inputPwd.equals(Admin[1])) {
//确定管理员后,在进行操作后,循环跳转到菜单,然后继续操作
boolean fanhui = true;
while (fanhui) {
System.out.println("管理员用户你好!你可以使用以下功能");
System.out.println("1. 开卡 2 注销卡 3. 查看所有用户列表 4 冻结账号 5. 返回登录界面 6 退出系统");
System.out.println("请输入你的操作(对应操作前的数字):");
int choose = scanner.nextInt();
switch (choose) {
//开卡
case 1: {
System.out.println("请输入用户名:");
int i = 0;
Scanner sc = new Scanner(System.in);
while (true) {
String NewName = sc.nextLine();
if (NewName.equals(Admin[0]) || NewName.equals(AllUser[i][0])) {
System.out.println("账户已经存在!请重新输入:");
} else {
System.out.println("请输入密码;");
String NewPsw = sc.nextLine();
//定义一个新二维数组
String[][] NewAllUser = new String[AllUser.length + 1][];
int temp = AllUser.length;
for (String[] item : AllUser) {
NewAllUser[AllUser.length - temp] = item;
temp--;
}
NewAllUser[AllUser.length] = new String[]{NewName, NewPsw, "0", "正常"};
AllUser = NewAllUser;
System.out.println("创建成功! \n 按任意键返回 y/n ");
sc.next();
break;
}
}
//跳出内循环,结束开卡操作
}
break;
case 2: {
System.out.println("请输入要注销的卡名:");
Scanner sc = new Scanner(System.in);
String deleName = sc.nextLine();
int del = 0;
int temp = 1;
//判断是否有该账户
while (true) {
//如果有这个元素
if (deleName.equals(AllUser[del][0])) {
//定义新数组
String[][] NewAllUser = new String[AllUser.length - 1][];
//去掉选中的用户名后存入新数组
int n = 0;
for (String[] item : AllUser) {
NewAllUser[n] = item;
if (deleName.equals(item[0])) {
continue;
}
n++;
}
AllUser = NewAllUser;
System.out.println("已经注销账户名为:" + deleName + " 的账户1 \n 按任意键返回 y/n ");
sc.next();
break;
}
//当遍历Alluser后没有指定元素,给出提示,继续输入账号
else if (del == AllUser.length - 1) {
System.out.println("没有该账户!");
del = 0;
deleName = sc.nextLine();
}
del++;
temp++;
//当连续3次错误,返回菜单
if (temp == AllUser.length * 3) {
System.out.println("你已经连续错误四次,返回菜单");
break;
}
}
}
break;
case 3: {
for (String[] item : AllUser) {
for (String str : item) {
System.out.print(" " + str);
}
System.out.println("");
}
System.out.println("按任意键返回 y/n");
scanner.next();
}
break;
case 4: {
System.out.println("请输入要冻结的账户:");
Scanner sc = new Scanner(System.in);
String freeUser = sc.nextLine();
int i = 0;
String temp = "冻结";
while (true) {
//找到目标账户
if (freeUser.equals(AllUser[i][0])) {
//判断是否已经冻结
if (temp.equals(AllUser[i][3])) {
System.out.println("账户已经被冻结!请重新输入");
i = 0;
freeUser = sc.nextLine();
} else {
AllUser[i][3] = temp;
System.out.println("冻结成功!");
System.out.println("按任意键返回 y/n");
sc.next();
break;
}
} else if (i == AllUser.length - 1) {
System.out.println("账户不存在,请检查后输入!");
i = -1;
freeUser = sc.nextLine();
}
i++;
if (i == AllUser.length) {
break;
}
}
}
break;
case 5: {
System.out.println("确认返回登录? y/n");
Scanner sc = new Scanner(System.in);
String y = sc.nextLine();
String str = "y";
if (str.equals(y)) {
fanhui = false;
} else {
break;
}
}
break;
case 6: {
System.out.println("确认退出? y/n");
Scanner sc = new Scanner(System.in);
String y = sc.nextLine();
String str = "y";
if (str.equals(y)) {
return;
} else {
fanhui=true;
}
}
}
}
} else {
System.out.println("账户或者密码错误!\n 按任意键返回 y/n");
scanner.next();
}
}
//用户登录 ,
else {
int p = 0;
boolean tuichu = true;
String str1 = "正常";
while (tuichu) {
for (int i = 0; i < AllUser.length; i++) {
p++;
//判断用户名
if (inputName.equals(AllUser[i][0])) {
//判断密码
if (inputPwd.equals(AllUser[i][1])) {
if (str1.equals(AllUser[i][3])) {
while (tuichu) {
System.out.println("欢迎用户" + AllUser[i][0] + "!");
System.out.println("请选择你的业务 \n 1. 查看余额 2. 存钱 3. 取钱 4. 转账 5.退出");
int choose = scanner.nextInt();
int Addmoney = 0;
int Getmoney;
int money;
switch (choose) {
case 1: {
System.out.println("你的余额为:" + AllUser[i][2] + "元");
System.out.println("输入任意键返回 y/n");
scanner.next();
}
break;
case 2: {
System.out.println("请输入你要存的钱:");
Addmoney = scanner.nextInt();
money = Integer.parseInt(AllUser[i][2]) + Addmoney;
AllUser[i][2] = "" + money;
System.out.println("成功! \n 任意键返回 y/n?");
scanner.next();
}
break;
case 3: {
System.out.println("是否取款? y/n");
Scanner sc = new Scanner(System.in);
String y = sc.nextLine();
String str = "y";
if (str.equals(y)) {
while (true) {
System.out.println("请输入你要取的金额:");
Getmoney = scanner.nextInt();
money = Integer.parseInt(AllUser[i][2]);
if (money - Getmoney < 0) {
System.out.println("余额不足! 请从新输入:");
} else {
AllUser[i][2] = "" + (money - Getmoney);
System.out.println("取款成功!按任意键退出 y/n?");
scanner.next();
break;
}
}
} else {
break;
}
}
break;
case 4: {
boolean w = true;
int tranMoney;
int temp = 0;
while (w) {
System.out.println("请输入对方账号");
Scanner sc = new Scanner(System.in);
String tranUser = sc.nextLine();
if (tranUser.equals(AllUser[i][0])) {
System.out.println("不能给自己转账!\n 按任意键返回 y/n");
sc.next();
}
//判断账号是否存在
else {
for (int j = 0; j < AllUser.length; j++) {
//找到账号
if (tranUser.equals(AllUser[j][0])) {
System.out.println("请输入转账金额:");
tranMoney = sc.nextInt();
if (Integer.parseInt(AllUser[i][2]) - tranMoney < 0) {
System.out.println("转账金额不能大于自己余额");
j--;
} else {
temp = tranMoney + Integer.parseInt(AllUser[j][2]);
AllUser[j][2] = "" + temp;
AllUser[i][2] = "" + (Integer.parseInt(AllUser[i][2]) - tranMoney);
System.out.println("转账成功!\n 按任意键返回 y/n");
sc.next();
w = false;
break;
}
} else if (j == AllUser.length - 1) {
System.out.println("输入的账号不存在!请重新输入:");
}
}
}
}
}
break;
case 5: {
System.out.println("是否退出? y/n");
Scanner sc = new Scanner(System.in);
String y = sc.nextLine();
String str = "y";
if (str.equals(y)) {
tuichu = false;
} else {
break;
}
}
break;
}
}
break;
} else {
System.out.println("你的账户已经被管理员冻结!\n 按任意键退出 y/n");
scanner.next();
tuichu = false;
break;
}
}
}
//用户名不存在
else if (p == AllUser.length) {
System.out.println("账户或者密码错误!请重新输入!");
inputName = scanner.nextLine();
System.out.println("请重新输入密码:");
inputPwd = scanner.nextLine();
i = -1;
p = 0;
}
}
}
}
} while (true);
}
}