目录
为了练习和巩固Java的基础语法,我们来上手制作一个取控制台方式操作的简易的学生管理系统(参考黑马程序员),其中涉及了:
Java的基础知识(如JVM工作原理)、idea的使用 |
关键字、变量、数据类型 |
运算符和表达式 |
流程控制语句(for、while、switch等) |
数组 |
方法 |
类和对象(面向对象) |
String字符串类型和引用数据类型 |
集合ArrayList |
需求文档
需求:
采取控制台的方式去书写学生管理系统。
分析:
初始菜单:
"-------------欢迎来到学生管理系统----------------" "1:添加学生" "2:删除学生" "3:修改学生" "4:查询学生" "5:退出" "请输入您的选择:"
学生类:
属性:id、姓名、年龄、家庭住址
添加功能:
键盘录入每一个学生信息并添加,需要满足以下要求:
-
id唯一
删除功能:
键盘录入要删除的学生id,需要满足以下要求:
-
id存在删除
-
id不存在,需要提示不存在,并回到初始菜单
修改功能:
键盘录入要修改的学生id,需要满足以下要求
-
id存在,继续录入其他信息
-
id不存在,需要提示不存在,并回到初始菜单
查询功能:
打印所有的学生信息,需要满足以下要求
-
如果没有学生信息,提示:当前无学生信息,请添加后再查询
-
如果有学生信息,打印。
准备工作
分析需求
根据需求文档做出下图分析
启动项目
打开idea,新建一个Java项目
点击创建后进入项目,创建一个学生类和一个测试类
创建完成后根据需求分析的内容,我们要先创建一个学生类
打开Student.java
创建一个Student类
下面按照创建类的三步骤创建一个Student类:
- 输入成员变量
- 创建该类的构造方法(带参和无参)
- 创建getter and setter方法
public class Student {
private String id;
private String name;
private int age;
private String address;
//全参构造
public Student(String id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
//无参构造
public Student() {
}
//getter and setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
拓展:同时按下 Alt+Ins 键可以快速打开快捷构造方法栏,里面有我们需要创建的构造方法以及getter and setter方法
测试类实现
完成了Student类的书写后,我们对测试类StudentManagementTest.java进行实现
- 根据需求分析,我们先书写main方法,完成一个基本的框架
main方法语句:
public static void main(String[] args) {
//创建一个集合放置Student类型的数据
ArrayList<Student> list = new ArrayList<>();
//创建Scanner类,为下方选择流程的输入操作服务
Scanner sc = new Scanner(System.in);
//循环操作
while (true){
System.out.println("-------欢迎进入Joe学生管理系统-------");
System.out.println("1:添加学生信息");
System.out.println("2:删除学生信息");
System.out.println("3:修改学生信息");
System.out.println("4:查询所有学生信息");
System.out.println("5:退出");
System.out.println("请输入您的选择:");
//输入选择
String chose = sc.next();
//选择流程(->格式自带break;)
switch (chose){
case "1" -> addStudent(list); //添加学生信息
case "2" -> deleteStudent(list); //删除学生信息
case "3" -> updateStudent(list); //修改学生信息
case "4" -> selectStudent(list); //查询所有学生信息
case "5" -> { //退出系统
System.out.println("##### 退出 #####");
System.exit(0);
}
default -> System.out.println("没有这个选项!");
}
}
}
- 通过我们对需求的分析发现,我们需要创建一个判断id是否存在的方法,以便后续方法的实现以及整个系统功能的优化实现
下面是这个方法judgment的实现代码:
注意list.size()一开始就为0(因为集合里面没有元素),不会执行循环,会直接返回-1,在有一些情境中这会是一个坑
/*注意list.size()一开始就为0(因为集合里面没有元素),不会执行循环,会直接返回-1*/
//判断id是否已经存在
//需求:id值,list
//返回?如果id存在则返回id所在的索引值,如果不存在则返回-1
public static int judgment(ArrayList<Student> list, String id){
//遍历集合寻找是否存在相同的id
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
String judgmentId = stu.getId();
if (judgmentId.equals(id)){
//如果id存在则返回id所在的索引值
return i;
}
}
//如果不存在则返回-1
return -1;
}
}
- 下面我们接着对增删改查四个核心功能进行一一实现
-
- 添加学生信息addStudent:
//添加方法:对键盘录入的学生信息进行添加,要求id唯一 //需求:list //返回?void public static void addStudent(ArrayList<Student> list){ //打印提示信息 System.out.println("##### 添加学生信息 #####"); //创建Scanner类键入学生信息 Scanner sc = new Scanner(System.in); //判断唯一性:如果id已经存在则需要重新输入一个新的id //循环直到输入一个在集合中不存在的id String id = null; //在循环外创建String,不然循环结束后,在循环中创建的String字符串会消失!!! while (true){ //输入id System.out.println("输入id:"); id = sc.next(); //判断id唯一性 int judgment = judgment(list,id); //judgment < 0代表不存在相同的id,退出循环,执行添加操作 if (judgment < 0){ break; }else { //id已经存在,继续输入 System.out.println("id重复,请重新输入!"); } } //输入姓名 System.out.println("输入姓名:"); String name = sc.next(); //输入年龄 System.out.println("输入年龄:"); int age = sc.nextInt(); //输入地址 System.out.println("输入地址:"); String address = sc.next(); //创建一个学生对象stu,将属性值放进对象中 Student stu = new Student(id,name,age,address); //再将Student类的stu对象存放进list(集合)当中 list.add(stu); //提示插入成功 System.out.println("+++++添加成功+++++"); }
- 删除学生信息deleteStudent:
-
//删除输入id对应的学生信息 //需求:list //返回?void public static void deleteStudent(ArrayList<Student> list){ //打印提示信息 System.out.println("##### 删除学生信息 #####"); //获取要删除的学生id Scanner sc = new Scanner(System.in); System.out.println("输入要删除的学生id:"); String sid = sc.next(); //判断id是否存在 int index = judgment(list, sid); if (index < 0){ //id不存在,不能删除对应id的学生信息 System.out.println("id不存在,删除失败"); }else { //id存在,删除 list.remove(index); System.out.println("-----删除成功-----"); } }
- 修改学生信息updateStudent:
//修改输入id对应的学生信息 //需求:list //返回?void public static void updateStudent(ArrayList<Student> list){ //打印提示信息 System.out.println("##### 修改学生信息 #####"); //获取要修改的学生id Scanner sc = new Scanner(System.in); System.out.println("输入要修改的学生id:"); String sid = sc.next(); //判断id是否存在 int index = judgment(list, sid); if (index < 0){ //id不存在,不能修改对应id的学生信息 System.out.println("id不存在,修改失败"); }else { //id存在,修改 //创建学生类 Student stu = list.get(index);//list.get(index)的地址值给了stu, //所以stu用setter方法更改属性值后存放在地址中后 //集合中遍历学生信息找到这个地址打印出来的就是修改后的属性值 //输入要修改的属性值 System.out.println("输入姓名:"); String name = sc.next(); stu.setName(name); System.out.println("输入年龄:"); int age = sc.nextInt(); stu.setAge(age); System.out.println("输入地址:"); String address = sc.next(); stu.setAddress(address); //提示信息 System.out.println("uuuuu 修改成功 uuuuu"); } }
这里有一个需要注意的点是:在Student stu = list.get(index);中list.get(index)的地址值给了stu,所以stu用setter方法更改属性值后存放在地址中,集合中遍历学生信息找到这个地址打印出来的就是修改,所以最后不必再把stu放进list集合里面,不同于添加方法
- 查询所有学生信息selectStudent:
//查询打印所有学生信息 //需求:list //返回?void public static void selectStudent(ArrayList<Student> list){ //打印提示信息 System.out.println("##### 查询所有学生信息 #####"); //如果没有学生信息则提示:当前无学生信息,请添加后再查询 if (list.size() == 0){ System.out.println("当前无学生信息,请添加后再查询!"); return;//如果没有学生信息就退出方法 } //打印表头 System.out.println("id\t姓名\t年龄\t家庭住址"); //如果有学生信息则打印 for (int i = 0; i < list.size(); i++) { Student stu = list.get(i); System.out.println(stu.getId()+'\t'+stu.getName()+'\t'+stu.getAge()+'\t'+stu.getAddress()); } }
- 添加学生信息addStudent:
这样,我们的测试类也书写完成了,下面是测试类的完整代码:
import java.util.ArrayList;
import java.util.Scanner;
public class StudentManagementTest {
public static void main(String[] args) {
//创建一个集合放置Student类型的数据
ArrayList<Student> list = new ArrayList<>();
//创建Scanner类,为下方选择流程的输入操作服务
Scanner sc = new Scanner(System.in);
//循环操作
while (true){
System.out.println("-------欢迎进入Joe学生管理系统-------");
System.out.println("1:添加学生信息");
System.out.println("2:删除学生信息");
System.out.println("3:修改学生信息");
System.out.println("4:查询所有学生信息");
System.out.println("5:退出");
System.out.println("请输入您的选择:");
//输入选择
String chose = sc.next();
//选择流程(->格式自带break;)
switch (chose){
case "1" -> addStudent(list); //添加学生信息
case "2" -> deleteStudent(list); //删除学生信息
case "3" -> updateStudent(list); //修改学生信息
case "4" -> selectStudent(list); //查询所有学生信息
case "5" -> { //退出系统
System.out.println("##### 退出 #####");
System.exit(0);
}
default -> System.out.println("没有这个选项!");
}
}
}
//添加方法:对键盘录入的学生信息进行添加,要求id唯一
//需求:list
//返回?void
public static void addStudent(ArrayList<Student> list){
//打印提示信息
System.out.println("##### 添加学生信息 #####");
//创建Scanner类键入学生信息
Scanner sc = new Scanner(System.in);
//判断唯一性:如果id已经存在则需要重新输入一个新的id
//循环直到输入一个在集合中不存在的id
String id = null; //在循环外创建String,不然循环结束后,在循环中创建的String字符串会消失!!!
while (true){
//输入id
System.out.println("输入id:");
id = sc.next();
//判断id唯一性
int judgment = judgment(list,id);
//judgment < 0代表不存在相同的id,退出循环,执行添加操作
if (judgment < 0){
break;
}else {
//id已经存在,继续输入
System.out.println("id重复,请重新输入!");
}
}
//输入姓名
System.out.println("输入姓名:");
String name = sc.next();
//输入年龄
System.out.println("输入年龄:");
int age = sc.nextInt();
//输入地址
System.out.println("输入地址:");
String address = sc.next();
//创建一个学生对象stu,将属性值放进对象中
Student stu = new Student(id,name,age,address);
//再将Student类的stu对象存放进list(集合)当中
list.add(stu);
//提示插入成功
System.out.println("+++++添加成功+++++");
}
//删除输入id对应的学生信息
//需求:list
//返回?void
public static void deleteStudent(ArrayList<Student> list){
//打印提示信息
System.out.println("##### 删除学生信息 #####");
//获取要删除的学生id
Scanner sc = new Scanner(System.in);
System.out.println("输入要删除的学生id:");
String sid = sc.next();
//判断id是否存在
int index = judgment(list, sid);
if (index < 0){
//id不存在,不能删除对应id的学生信息
System.out.println("id不存在,删除失败");
}else {
//id存在,删除
list.remove(index);
System.out.println("-----删除成功-----");
}
}
//修改输入id对应的学生信息
//需求:list
//返回?void
public static void updateStudent(ArrayList<Student> list){
//打印提示信息
System.out.println("##### 修改学生信息 #####");
//获取要修改的学生id
Scanner sc = new Scanner(System.in);
System.out.println("输入要修改的学生id:");
String sid = sc.next();
//判断id是否存在
int index = judgment(list, sid);
if (index < 0){
//id不存在,不能修改对应id的学生信息
System.out.println("id不存在,修改失败");
}else {
//id存在,修改
//创建学生类
Student stu = list.get(index);//list.get(index)的地址值给了stu,
//所以stu用setter方法更改属性值后存放在地址中后
//集合中遍历学生信息找到这个地址打印出来的就是修改后的属性值
//输入要修改的属性值
System.out.println("输入姓名:");
String name = sc.next();
stu.setName(name);
System.out.println("输入年龄:");
int age = sc.nextInt();
stu.setAge(age);
System.out.println("输入地址:");
String address = sc.next();
stu.setAddress(address);
//提示信息
System.out.println("uuuuu 修改成功 uuuuu");
}
}
//查询打印所有学生信息
//需求:list
//返回?void
public static void selectStudent(ArrayList<Student> list){
//打印提示信息
System.out.println("##### 查询所有学生信息 #####");
//如果没有学生信息则提示:当前无学生信息,请添加后再查询
if (list.size() == 0){
System.out.println("当前无学生信息,请添加后再查询!");
return;//如果没有学生信息就退出方法
}
//打印表头
System.out.println("id\t姓名\t年龄\t家庭住址");
//如果有学生信息则打印
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getId()+'\t'+stu.getName()+'\t'+stu.getAge()+'\t'+stu.getAddress());
}
}
/*注意list.size()一开始就为0(因为集合里面没有元素),不会执行循环,会直接返回-1*/
//判断id是否已经存在
//需求:id值,list
//返回?如果id存在则返回id所在的索引值,如果不存在则返回-1
public static int judgment(ArrayList<Student> list, String id){
//遍历集合寻找是否存在相同的id
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
String judgmentId = stu.getId();
if (judgmentId.equals(id)){
//如果id存在则返回id所在的索引值
return i;
}
}
//如果不存在则返回-1
return -1;
}
}
运行
书写完成后我们来测试一下运行情况:
- 添加测试
- 删除测试
- 修改测试
- 查询测试
1.添加与查询测试,进入后输入1进行学生添加,尝试添加3个学生信息
然后输入4查询学生是否添加成功(查询测试)
如图,查询成功,信息添加成功
2.删除测试,输入要删除的id,删除完成后再查询验证是否完成删除
如图,查询成功,信息删除成功
2.修改测试,输入要修改的id,修改完成后再查询验证是否完成修改
然后输入4查询学生是否修改成功(查询测试)
如图,查询成功,信息修改成功
到此,整个简易的学生管理小项目就完成啦!~