Java入门到精通(干就完了)

文章目录

1、Java语言概述

  • Java知识背景

在这里插入图片描述

  • 为什么用Java
    1、世界上最流行的编程语言之一,在国内使用最为广泛的编程语言。
    2、可移植性、安全可靠、性能较好。
    3、开发社区最完善,功能最丰富。
  • Java能做什么

在这里插入图片描述

  • Java技术体系
技术体系 说明
Java SE(Java Standard Edition):标准版 Java技术的核心和基础
Java EE(Java Enterprise Edition):企业版 企业级应用开发的一套解决方案
Java ME(Java Micro Edition):小型版 针对移动设备应用的解决方案
  • 总结
    1、Java是是一门高级编程语言
    2、Java是sun公司研发的,现在属于Oracle公司
    3、Java之父是詹姆斯·高斯林
    4、Java基本上什么都可以干,主要做互联网系统的开发
    5、Java技术平台:JavaSE(标准版)、JavaEE(企业版)、JavaME(小型版)

2、Java开发环境的准备:JDK简介、安装、常用命令

在这里插入图片描述

  • JDK下载
    Oracle官网:http://www.oracle.com/java/technologies/downloads/
    在这里插入图片描述

  • 如何验证JDK安装成功
    java.exe与javac.exe能正常运行即可
    在这里插入图片描述在这里插入图片描述

  • Javac和Java介绍
    在这里插入图片描述
    将来我们写好的Java程序都是高级语言,计算机底层是硬件不能识别这些语言。
    必须通过Javac编译工具进行翻译,然后再通过Java执行工具执行才可以驱动机器干活。

  • 命令行窗口的常用命令

常用命令 作用
盘符: 切换到某个盘下:D:,C:
dir 查看当前路径下的文件信息
cd 进入单级目录:cd itheima
进入多级目录:cd D:\itheima\JavaSE\第一天
回退到上一级目录:cd ..
回退到盘符根目录:cd \
(注意:按Table可以补全目录)
cls 清屏

3、Java入门程序

3.1、Hello World

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 常见问题

1、windows的文件扩展名没有勾选
在这里插入图片描述

2、代码写了,但是忘记保存了
在这里插入图片描述

3、文件名和类名不一致。
在这里插入图片描述

4、大小写错误,单词拼写错误,存在中文符号,找不到Main方法。
在这里插入图片描述

5、括号不配对.
在这里插入图片描述

6、编译或执行工具使用不当.
在这里插入图片描述

7、…

3.3 Java程序的执行原理

  • 不管是什么样的高级编程语言,最终都是翻译成计算机底层可以识别的机器语言(0和1)

3.4 JDK组成、跨平台原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 JDK安装后Path和Java_home环境变量

在这里插入图片描述

  • 开始配置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、IDEA开发工具:简介、下载、安装

4.1 简介

在这里插入图片描述

4.2 下载

下载UItimate旗舰版: https://www.jetbrains.com/idea/
安装:傻瓜式安装,建议修改安装路径(不要安装在有空格和中文的路径下)。

4.3 IDEA开发工具:开发第一个程序

在这里插入图片描述

在这里插入图片描述
① 创建project空工程
在这里插入图片描述
② 创建module模块
在这里插入图片描述
找到你下载JDK的路径位置,添加JDK
在这里插入图片描述
在这里插入图片描述
③创建package包
在这里插入图片描述
在这里插入图片描述
④创建class类
在这里插入图片描述
⑤在类中编写代码
在这里插入图片描述
⑥完成编译运行
在这里插入图片描述

4.4 IDEA字体、主题、背景色设置

在这里插入图片描述
在这里插入图片描述

4.5 常用快捷键介绍

在这里插入图片描述

Ctrl + Alt + T 分支、循环快捷键

4.6 IDEA工程、模块常用操作

1、删除类文件
在这里插入图片描述

2、修改类名称
在这里插入图片描述

3、修改模块
在这里插入图片描述
在这里插入图片描述

4、导入模块

关联导入:原路径模块删除,此模块也会删除

在这里插入图片描述
在这里插入图片描述

建议新建一个模块,名称就是导入模块的名称,将代码拷贝进去,避免原路径删除导致模块丢失

5、删除模块

方法1:Remove Module,此方法只是在IDEA界面中删除,源文件并没有删除

在这里插入图片描述

方法2:到整个项目路径下找到要删除的文件,直接删除

方法3:在IDEA中点击模块,顶部显示模块名称后右键,delete。

在这里插入图片描述

当然方法3也有bug,不能删除干净,源文件还会复原,但是IDEA界面上不显示出来,如下操作做完再重启IDEA,即可删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

建议使用方法1 + 方法2,出问题重启IDEA

6、 打开工程
在这里插入图片描述
在这里插入图片描述
7、关闭工程
在这里插入图片描述
或者直接X掉,关闭IDEA

5、Java基础语法

5.1 注释

什么是注释

注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。

注释有哪些

在这里插入图片描述

注释的特点

注释不影响程序的执行
在这里插入图片描述

多学一招

在这里插入图片描述

5.2 字面量

计算机是用来处理数据的,字面量就是告诉程序员∶数据在程序中的书写格式。

常用数据

在这里插入图片描述
在这里插入图片描述

5.3 变量

什么是变量

变量就是用来存储一一个数据的内存区域(可以理解成盒子),且里面存储的数据可以变化。
1、必须以字母、下划线、或者美元符$开头;

以美元符$ 开头命名的变量虽然能够编译通过但是不建议使用;

中文也可以作为命名开头且编译也能通过,但是不建议使用。

2、除开头外后面的部分可以有字母、下划线、美元符$以及数字组成;

3、虽然变量名不限制长度,但能表达清楚命名的含义即可;

4、变量名不可以和java的关键字冲突;

5、再命名中大小写是又区别的,即使由同一个单词命名但是有个别字母的大小写的区别,产生的就是两个不同的变量。
在这里插入图片描述

变量使用注意事项

在这里插入图片描述

5.4 变量在计算机中的底层原理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5 进制转换,八进制、十六进制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.6 数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.7 关键字、标识符

在这里插入图片描述
在这里插入图片描述

6、关于Java语言基础知识我们需要学会什么?

在这里插入图片描述

7、类型转换

7.1 自动类型转换

在这里插入图片描述

7.2 表达式的自动类型转换

在这里插入图片描述

面试题

在这里插入图片描述

咋一看 i 和 j 都是byte变量,但是两者相加的值需要 int 类型承接 。
因为 i 和 j 在运算时默认是 int 类型 进行运算。同时,如果i=120,j=100,两者都不超过byte类型范围,但是相加得到的值就不一定了。
索性当成int类型计算能保证能赋值。

7.3 强制类型转换

在这里插入图片描述
在这里插入图片描述

8、运算符

8.1 基本算数运算符

在这里插入图片描述

数值拆分案例

在这里插入图片描述
在这里插入图片描述

8.2 +符号做连接符

在这里插入图片描述

8.3 自增自减运算符

在这里插入图片描述
在这里插入图片描述

面试案例

在这里插入图片描述

8.4 赋值运算符

在这里插入图片描述

8.5 关系运算符

在这里插入图片描述

8.6 逻辑运算符

在这里插入图片描述
在这里插入图片描述

8.7 三元运算符

在这里插入图片描述

8.8 运算符优先级

在这里插入图片描述

9、API介绍、案例技术:键盘录入

在这里插入图片描述
在这里插入图片描述

10、程序流程控制

在这里插入图片描述
在这里插入图片描述

10.1 分支结构

10.1.1 if分支

  • 根据判定的结果( 真或假)决定执行某个分支的代码,适合做区间匹配
    在这里插入图片描述

10.1.2 switch分支

在这里插入图片描述

switch使用的注意事项
在这里插入图片描述

在这里插入图片描述

10.2 循环结构

10.2.1 for循环

在这里插入图片描述

10.2.2 while循环

在这里插入图片描述

10.2.3 do-while循环

在这里插入图片描述

10.2.4 死循环

在这里插入图片描述

10.2.5 嵌套循环

在这里插入图片描述

10.2.6 跳转关键字:break、continue

在这里插入图片描述

11、 随机数Random

在这里插入图片描述
在这里插入图片描述

当然也可以指定随机区间 Random rm = new Random(); rm.nextInt(10,30);

12、数组

12.1 概述

在这里插入图片描述
在这里插入图片描述

12.2 定义方式一、访问、注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

12.3 定义方式二、元素默认值规则

在这里插入图片描述
在这里插入图片描述

12.4 数组遍历

在这里插入图片描述

快捷写法 数组变量.for初始化变量,例如:ages.fori,就会弹出提示
在这里插入图片描述

12.5 数组案例

12.5.1 元素求和

在这里插入图片描述

12.5.2 数组求最值

在这里插入图片描述

12.5.3 猜数字游戏

在这里插入图片描述
在这里插入图片描述

12.5.4 随机排名

在这里插入图片描述

12.5.5 数组排序

在这里插入图片描述
在这里插入图片描述

12.6 数组内存图、常见使用问题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

12.7 Debug工具

在这里插入图片描述

13、方法

13.1 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.2 方法定义格式、常见问题

用static修饰符,表示是该类的方法,不是实例的方法,可以在static修饰的方法中调用static修饰的方法。
不用static修饰符,则需要new类的实例,来调用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.3 方法案例

在这里插入图片描述

13.3.1 求和

在这里插入图片描述

13.3.2 判断奇偶数

在这里插入图片描述

13.3.3 求最值

在这里插入图片描述

13.4 方法的内存原理

在这里插入图片描述
在这里插入图片描述
详细动画看这里https://editor.csdn.net/md/?articleId=127215629

13.5 方法参数传递机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13.6 方法参数传递的案例

13.6.1 打印数组的内容

在这里插入图片描述

13.6.2 从数组中查询元素分索引返回

在这里插入图片描述

13.6.3 比较两个数组内容是否相等

在这里插入图片描述

13.7 方法重载、return关键字

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14 编程训练

14.1 买飞机票

在这里插入图片描述

package com.itheima.demo;
import java.util.Scanner;

public class Test1 {
   
	public static void main(String[] args) {
   
		//目标:完成买飞机票的价格计算。
		// 1、让用户输入机票原价,月份,仓位类型
		Scanner sc = new Scanner(System.in);
		
		System. out. println("请您输入机票原价: ");
		double money = sc. nextDouble() ;
		
		System. out. println("请您输入机票的月份(1-12) : ");
		int month = sc. nextInt();
		
		System. out. printLn("请您选择仓位类型: ");
		String type = sc.next();
		// 4.调用方法,统计结果.
		System . out . printLn("机票优惠后的价格是: + calc(money, month, type));

	}
	public static doubLe calc(doubLe money, int month, String type] {
   
		// 3.判断用户选择的信息情况
		if (month >= 5 && money <= 10) {
   
			//旺季
			switch (type) {
   
				case "头等舱":
					money *= 0.9; // money = money★0.9;
					break;
				case "经济舱":
					money *= 0.85; // money = money * 0.85;
					break;
				default:
					System.out.printLn("您输入的仓位类型有误~~");
					money = -1; //表示当前无法计算价格!
		}else if(month == 11 II month == 12 II month >= 1 & month <= 4){
    
			//淡季
			switch (type) {
   
				case "头等舱":
					money *= 0.7; // money = money★0.9;
					break;
				case "经济舱":
					money *= 0.65; // money = money * 0.85;
					break;
				default:
					System.out.printLn("您输入的仓位类型有误~~");
					money = -1; //表示当前无法计算价格!
		}else {
   
			System.out.println("对不起,您输入的月份有问题~~");
			money = -1; //表示当前无法计算价格!
		}
	}
	return money; //最终价格
}

14.2 找素数

在这里插入图片描述
在这里插入图片描述

14.3 验证码

在这里插入图片描述
在这里插入图片描述

14.4 数组的复制

在这里插入图片描述
在这里插入图片描述

14.5 评委打分

在这里插入图片描述

14.6 数字加密

在这里插入图片描述

14.7 双色球系统开发

在这里插入图片描述

15 面向对象

15.1 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.2 面向对象、注意事项

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.3 内存机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

垃圾回收

  • 注意:当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
  • Java存在自动垃圾回收器,会定期进行清理。

15.4 面向对象实战

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Goods类

package com.itheima.demo;

public class Goods {
   
	int id; //编号
	String name; //名称
	double price; //价格
	int buyNumber; // 购买数量
}

测试模块

package com.itheima.demo;

import java.util.Scanner;

/**
目标:面向对象编程训练:购物车模块模拟。
*/

public class ShopCarTest {
   
	public static void main(String[] args) {
   
		// 1.定义商品类,用于后期创建商品对象
		// 2.定义购物车对象:使用一 个数组对象表示。
		Goods[] shopCar = new Goods[100]; // [null, null, ...]
		// 3.搭建操作架构
		while(true){
   
			System. out . println("请您选择如下命令进行操作: "); .
			System. out. printLn("添加商品到购物车: add");
			System. out. println("查询购物车商品展示: query");
			System. out. printLn("修改商品购买数量: update");
			System. out . println("结算购买商品的金额: pay");
			Scanner sc = new Scanner(System.in);
			System. out . printLn("请您输入命令: ");
			String command = sc.next();
			switch (command){
   
				case "add" :
					//添加商品到购物车
					addGoods(shopCar,sc);
					break;
				case "query":
					//查询购物车商品展示
					queryGoods(shopCar);
					break;
				case "update":
					//修改商品购买数量
					updateGoods (shopCar,sc);
					break;
				case "pay":
					//结算购买商品的金额
					pay(shopCar);
					break;
				default :
					System. out. print1n("没有该功能! ");
			}
		}
	}
	
	/**
	查询购物车中的商品对象信息,并展示出来
	*/
	public static void queryGoods (Goods[] shopCar) {
   
		System. out. printLn("===========查询购物车信息如下============");
		System. out. println("编号\t\t名称\t\t\t价格\t\t\t购买数量");
		// shopCar = [g1, g2, g3, null, null, ...]
		for (int i =; i < shopCar.length; i++) {
   
			Goods g = shopCar[i];
			if(g != null){
   
				//展示这个商品对象
				System. out. println(g.id +"\t\t" + g.name+"\t\t\t" + g.price +"\t\t\t" + g.buyNumber);
			}else {
   
				//遍历结束
				break;
			}
		}
	}

	public static void updateGoods (Goods[] shopCar ,Scanner sc) {
   
		//让用户输入要修改商品的id,根据id查询出要修改的商品对象。
		while (true) {
   
			System. out . printLn("请您输入要修改的商品id:");
			int id = sc.nextInt();
			Goods g = getGoodsById(shopCar, id);
			if(g == null){
   
				//没有该商品.
				System . out . printIn("对不起,没有购买商品! ");
			}else {
   
				//说明存在该商品对象,可以修改它了
				System. out. println("请您输入:”+ g.name +" 商品最新购买数量: ");
				int buyNumber = sc.nextInt();
				g. buyNumber = buyNumber;
				System. out. println("修改完成! ");
				queryGoods(shopCar);
				break;
			}
		}
	}

	public static Goods getGoodsById(Goods[] shopCar ,int id){
   
		// shopCar = [g1, g2, g3,null, null, ...] .
		for (int i = 0; i < shopCar .length; i++) {
   
			Goods g = shopCar[i];
			if(g != null){
   
				//判断这个商品对象的id是否是我们要找的
				if(g.id == id){
   
					return g;
				}
			}else {
   
				return null; //找完了全面存在的商品,都没有找到!
			}
		}
		return null; //代表找完了100个商品都没有找到id - -样的商品
	}

	public static void pay(Goods[] shopCar) {
   
		query6oods(shopCar);
		//1.定义一个求和变量累加金额
		double money =;
		// 2、遍历购物车数组中的全部商品对象,累加单价*数量
		// [g1, g2, null, ...1
		for (int i = 0; i < shopCar.length; i++) {
   
			Goods g = shopCar[i];
			if(g != null){
   
				money += (g.price * g. buyNumber);
			}else {
   
				break;
			}
		}
		System . out . println("订单总金额:"+ money);
	}

	/**
	完成商品添加到购物车的功能
	*/
	public static void addGoods(Goods[] shopCar ,Scanner sc) {
   
		// 1.录入用户输入的购买商品的信息。
		System. out.println("请您输入购买商品的编号(不重复) : ");
		int id = sc.nextInt();
		System. out.println("请您输入购买商品的名称: ");
		String name = sc.next();
		System. out . println("请您输入购买商品的数量: ");
		int buyNumber = sc.nextInt();
		System. out. println("请您输入购买商品的价格: ");
		doubLe price = sc.nextDouble();
		// 2、把这个购买商品的信息封装成一 个商品对象
		Goods g = new Goods();
		gl.id = id;
		g.name = name;
		g. buyNumber = buyNumber;
		g.price = price;
		
		// 3、把这个商品对象添加到购物车数组中去。
		// shopCar = [a, a2, null, ........]
		//						i
		for (int i = 0; i < shopCar.length; i++) {
   
			if(shopCar[i] == null){
   
				//说明此位置没有元素存入,把我们新买的商品添加到此处即可
				shopCar[i] I g;
				break; //结束,因为商品已经成功存入了,不需要继续找位置了
			}
		}
		System. out. println("您的商品:”+ g.name +" 添加到购物车完成! ");
	}
}

15.5 构造器、this

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

this调用本类中的其他方法:指在普通成员方法中使用this调用另一个成员方法
this调用本类中的其他构造方法,调用时要放在构造方法的首行。

15.6 封装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.7 标准JavaBean

在这里插入图片描述

15.8 成员变量、局部变量区别

在这里插入图片描述
在这里插入图片描述

15.9 面向对象综合案例

在这里插入图片描述
在这里插入图片描述

16 常用API(String、ArrayList)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.1 String

16.1.1 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.1.2 对象创建的原理

在这里插入图片描述
在这里插入图片描述

16.1.3 String类常见面试题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.1.4 Stirng类常用API

在这里插入图片描述
在这里插入图片描述

String的equals比较,如果a.equals(b)的a是null会报空指针异常

在这里插入图片描述

public boolean contains(CharSequence s):判断传入字符串是否包含其中。
public boolean startsWith(String prefix):判断是否由传入字符串开头
public String[] split(String s):按照某个内容把字符串分割成字符串数组返回。

16.1.5 String案例:验证码、登录、隐私号码

在这里插入图片描述

public class StringExec6 {
   
	public static void main(String[] args) {
   
		// 1、定义可能出现的字符信息
		String datas = "abcdefghijkLmnopqrstuwxyZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		// 2、循环5次,每次生成- - 个随机的索引,提取对应的字符连接起来即可
		String code =“";
		Random r = new Random();
		for(inti=;i<5;i++){
   
			//随机一个索引
			int index = r.nextInt (datas . Length());
			char C = datas. charAt(index);
			code += c;
		}
		// 3.输出宇符串变量即可
		System. out. println(code);
}

在这里插入图片描述

	// 1、定义正确的登录名称和密码
	String okLoginName =” admin";
	String okPassword = " itheima";
	// 2、定义一个循环,循环3次,让用户登录
	Scanner sc = new Scanner(System.in);
		for(inti=1;i<=3;i++){
   
			System. out. println("请您输入登录名称: ");
			String loginName = sc.next();
			System. out. println("请您输入登录密码: ");
			String password = sc.next();
			// 3、判断登录是否成功! 
			if (okLoginName . equals (loginName)){
   
				// 4、判断密码是否正确
				if(okPassword . equals(password)){
   
					System . out. printLn("登录成功!欢迎进入系统随意浏览~~~~");
					break;
				}else {
   
					//密码错误了
					System. out . println("您的密码不正确!您还剩余"+ (3 - i) +"次机会登录机会!");
				}
			}else {
   
				System. out. println("您的登录名称不正确!您还剩余"+ (3 - i) +"次机会登录机会!");
			}
	}

在这里插入图片描述

public class StringExec8 {
   

	public static void main(String[] args) {
   
		// 1、键盘录入一个手机号码
		Scanner sc = new Scanner(System. in);
		System. out. println("请您输入您的手机号码: ");
		String tel = sc.next();
		// 2、截取号码的前三位, 后四位 18665666520
		String before = tel. substring(0, 3); //日1 2
		String after = tel. substring(7); // 从索引7开始截取到手机号码的末尾
		String s = before + "****" + after;
		System. out . printLn(s);
	}
}

16.2 ArrayList

16.2.1 集合概述

数组变量输出是地址
集合变量输出是数据

在这里插入图片描述
在这里插入图片描述

16.2.2 ArrayList集合快速入门

在这里插入图片描述

16.2.3 ArrayList对于泛型的支持

在这里插入图片描述

16.2.4 ArrayList常用API、遍历

在这里插入图片描述

// 3、完成集合的遍历
for (int i =0; i < list.size(); i++) {
   
	System. out. println(list.get(i));
}

16.2.5 ArrayList集合案例

在这里插入图片描述

public class ArrayListTest4 {
   
	public static void main(String[] args) {
   
		//目标:学习遍历并删除元素的正确方案。
		// 1、创建一个ArrayList集合存储- -个班级学生的成绩
		ArrayList<Integer> scores = new ArrayList<>();
		scores . add(98);
		scores . add(77);
		scores. add(66);
		scores . add(89);
		scores . add(79);
		scores . add(50);
		scores . add(100);
		System . out . printLn(scores);
		
		// 2、把低于80分的成绩从集合中去掉。
		// scores = [98, 77, 66, 89,79, 50, 100]]
		// scores = [98, 66, 89, 50,100]
		// 									i
		// 有毛病的代码!
		// for (int i =日; i < scores.size(); i++) {
   
		// 	   int score = scores.get(i);
		//	   if(score < 80){
   
		//		      这个分数必须删除
		//			  scores. remove(i);
		//		}
		//	}
		//	System. out. printIn(scores);
		
		// 完关的方案之一
		for (int i = 0; i < scores.size(); i++) {
   
			int score = scores. get(i);
			if(score < 80){
   
				//这个分数必须删除
				scores. remove(i);
				i--; //删除成功后,必须退一步,这样可以保证下次回到这个位置,如此则不会跳过数据

			}
		}
		System . out . println(scores);

		// 完美的方案之二
		// 从后面倒着遍历再删除就可以。
		for (int i = scores.size() - 1; i >= 0;i--) {
   
			int score = scores.get(i);
			if(score < 80){
   
				scores. remove(i);
			}
		}
		System . out . println(scores); .

	}
}

17 ATM系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ATMSystme

package com.itheima;
 
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
 
/**
    ATM系统的入口类。
 */
public class ATMSystem {
   
    public static void main(String[] args) {
   
        // 1、定义账户类
        // 2、定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作。
        ArrayList<Account> accounts = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        // 3、展示系统的首页
        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(accounts, sc);
                    break;
                case 2:
                    // 用户账户开户(ALT + ENTER)
                    register(accounts,sc);
                    break;
                default:
                    System.out.println("您输入的操作命令不存在~~");
            }
        }
    }
 
    /**
     * 登录功能
     * @param accounts 全部账户对象的集合
     * @param sc 扫描器
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
   
        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, accounts);
            if(acc != null){
   
                while (true) {
   
                    // 卡号存在的
                    // 4、让用户输入密码,认证密码
                    System.out.println("请您输入登录密码:");
                    String passWord = sc.next();
                    // 判断当前账户对象的密码是否与用户输入的密码一致
                    if(acc.getPassWord().equals(passWord)) {
   
                        // 登录成功了
                        System.out.println("恭喜您," + acc.getUserName() +"先生/女生进入系统,您的卡号是:" + acc.getCardId());
                        // .... 查询 转账 取款 ....
                        // 展示登录后的操作页。
                        showUserCommand(sc, acc, accounts);
                        return; // 干掉登录方法
                    }else {
   
                        System.out.println("对不起,您输入的密码有误~~");
                    }
                }
            }else {
   
                System.out.println("对不起,系统中不存在该账户卡号~~");
            }
        }
 
    }
 
    /**
      展示登录后的操作页
     */
    private static void showUserCommand(Scanner sc, Account acc, ArrayList<Account> accounts) {
   
        while (true) {
   
            System.out.println("===============用户操作页===================");
            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:
                    // 查询账户(展示当前登录的账户信息)
                    showAccount(acc);
                    break;
                case 2:
                    // 存款
                    depositMoney(acc, sc);
                    break;
                case 3:
                    // 取款
                    drawMoney(acc, sc);
                    break;
                case 4:
                    // 转账
                    transferMoney(sc, acc, accounts);
                    break;
                case 5:
                    // 修改密码
                    updatePassWord(sc, acc);
                    return; // 让当前方法停止执行,跳出去
                case 6:
                    // 退出
                    System.out.println("退出成功,欢迎下次光临");
                    return; // 让当前方法停止执行,跳出去
                case 7:
                    // 注销账户
                    if(deleteAccount(acc,sc,accounts)){
   
                        // 销户成功了,回到首页
                        return; // 让当前方法停止执行,跳出去
                    }else {
   
                        // 没有销户成功, 还是在操作页玩
                        break;
                    }
                default:
                    System.out.println("您输入的操作命令不正确~~");
            }
        }
    }
 
    /**
     * 销户功能
     * @param acc
     * @param sc
     * @param accounts
     */
    private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) {
   
        System.out.println("===================用户销户========================");
        System.out.println("您真的要销户?y/n");
        String rs = sc.next();
        switch (rs) {
   
            case "y":
                // 真正的销户
                // 从当前账户集合中,删除当前账户对象,销毁就完成了。
                if(acc.getMoney() > 0){
   
                    System.out.println("您账户中还有钱没有取完,不允许销户~");
                }else {
   
                    accounts.remove(acc);
                    System.out.println("您的账户销户完成~~");
                    return true; // 销户成功
                }
                break;
            default:
                System.out.println("好的,当前账户继续保留~");
        }
        return false;
    }
 
    /**
     * 修改密码
     * @param sc 扫描器
     * @param acc 当前登录成功的账户对象。
     */
    private static void updatePassWord(Scanner sc, Account acc) {
   
        System.out.println("===================用户密码修改========================");
        while (true) {
   
            System.out.println("请您输入当前密码:");
            String passWord = sc.next();
            // 1、判断这个密码是否正确
            if(acc.getPassWord().equals(passWord)){
   
                while (true) {
   
                    // 密码正确
                    // 2、输入新密码。
                    System.out.println("请您输入新密码:");
                    String newPassWord = sc.next();
 
                    System.out.println("请您确认新密码:");
                    String okPassWord = sc.next();
 
                    if(newPassWord.equals(okPassWord)) {
   
                        // 2次密码一致,可以修改了
                        acc.setPassWord(newPassWord);
                        System.out.println("恭喜您,您密码修改成功了~~");
                        return;
                    }else {
   
                        System.out.println("您输入的2次密码不一致~~");
                    }
                }
            }else {
   
                System.out.println("您输入的密码不正确~");
            }
        }
    }
 
    /**
     * 转账功能
     * @param sc 扫描器
     * @param acc  自己的账户对象
     * @param accounts 全部账户的集合。
     */
    private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) {
   
        System.out.println("===================用户转账操作========================");
        // 1、判断是否足够2个账户
        if(accounts.size() < 2){
   
            System.out.println("当前系统中,不足2个账户,不能进行转账,请去开户吧~~");
            return; // 结束当前方法
        }
 
        // 2、判断自己的账户是否有钱
        
  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值