Java 学生管理系统代码知识点与技术解析
一、引言
在 Java 编程学习进程中,实现一个学生管理系统是极具代表性且实用的案例。它能帮助我们巩固诸多 Java 的基础知识点和常用技术。本文会基于给定的 StudentManagement.java 代码,对其中所运用的知识点和技术展开详尽介绍。
二、代码整体功能概述
此 Java 代码实现了一个简易的学生管理系统,允许用户开展添加学生、删除学生、更新学生信息、查询学生信息以及退出系统等操作。系统借助数组来存储学生对象,并且提供了相应的菜单界面供用户选择操作。
三、知识点与技术详细解析
(一)类与对象
1. 学生类(Student)
class Student {
private String name;
private int age;
private String gender;
// 无参构造器
public Student() {
}
// 有参构造器
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// getter 和 setter 方法
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
- 封装:
Student类运用了封装思想,把学生的姓名、年龄和性别属性声明为private,外部类无法直接访问这些属性,只能通过所提供的getter和setter方法来获取和修改属性值。这样做提高了数据的安全性和可维护性,防止外部类随意修改数据。 - 构造器:提供了无参构造器和有参构造器。无参构造器用于创建默认的学生对象,当我们不确定学生的具体信息时可以先创建一个空的学生对象;有参构造器用于在创建对象时直接初始化学生的属性,方便快捷。
2. 学生管理系统类(StudentManagement)
public class StudentManagement {
// 学生对象数组
private Student[] stus;
// 实际学生个数
private int counter;
// 键盘录入对象
private Scanner in;
// 无参构造器:默认容量 100
public StudentManagement() {
stus = new Student[100];
in = new Scanner(System.in);
}
// 有参构造器:size 表示初始容量
public StudentManagement(int size) {
stus = new Student[size];
in = new Scanner(System.in);
}
}
- 组合:
StudentManagement类中包含了一个Student对象数组stus,这是一种组合关系。通过这种方式,StudentManagement类可以管理多个学生对象,将学生信息的存储和管理功能封装在一起。 - 构造器重载:提供了无参构造器和有参构造器。用户能够根据需求选择使用默认容量(100)或指定初始容量来创建
StudentManagement对象,增加了代码的灵活性。
(二)数组
1. 学生对象数组
private Student[] stus;
在 StudentManagement 类里,使用 Student 对象数组 stus 来存储学生信息。数组的长度可在创建 StudentManagement 对象时指定,默认长度为 100。数组是一种简单且常用的数据结构,适合存储同类型的多个元素。
2. 数组扩容
if (counter < stus.length) {
stus[counter] = new Student(name, age, gender);
counter++;
System.out.println("添加成功");
} else {
// 创建一个新数组,容量为原数组的 2 倍
Student[] newStus = new Student[stus.length * 2];
// 将原数组内容复制到新数组
for (int i = 0; i < stus.length; i++) {
newStus[i] = stus[i];
}
// 将新数组赋值给原数组引用
stus = newStus;
// 添加新学生到新数组
stus[counter] = new Student(name, age, gender);
counter++;
System.out.println("添加成功(数组已扩容)");
}
当数组已满时,就需要进行扩容操作。这里创建一个新的数组,其容量为原数组的 2 倍,接着把原数组的内容复制到新数组中,最后将新数组赋值给原数组的引用。这种扩容方式虽然简单,但在数据量较大时可能会影响性能,后续可以考虑使用动态数组类(如 ArrayList)来优化。
(三)输入输出
1. 键盘录入
private Scanner in;
// ...
in = new Scanner(System.in);
使用 Scanner 类从键盘读取用户输入的信息,例如学生的姓名、年龄、性别以及用户选择的操作等。Scanner 类是 Java 中常用的输入类,它提供了多种方法来读取不同类型的数据。
2. 控制台输出
System.out.println("********************");
System.out.println(" 学生管理系统");
System.out.println("********************");
// ...
运用 System.out.println() 和 System.out.print() 方法把提示信息和操作结果输出到控制台。println() 方法会在输出内容后换行,而 print() 方法不会换行,根据实际需求选择使用。
(四)控制语句
1. 循环语句
Loop: while (true) {
// 打印提示信息
sm.prompt();
// 获取用户操作
option = sm.in.nextInt();
if (option < 0 || option > 4) {
System.out.println("错误操作,请重试");
continue;
}
switch (option) {
case 1:
sm.addStudent();
break;
case 2:
sm.deleteStudent();
break;
case 3:
sm.updateStudent();
break;
case 4:
sm.selectStudent();
break;
case 0:
break Loop;
}
}
使用 while (true) 创建一个无限循环,持续显示操作菜单并等待用户输入。通过 switch 语句依据用户输入的操作选项执行相应的操作。当用户选择退出系统(选项 0)时,使用 break Loop 语句跳出循环。这里的 Loop 是一个标签,用于标识循环,方便在嵌套循环中准确跳出指定的循环。
2. 条件语句
if (index != -1) {
// 找到目标学生,执行相应操作
} else {
System.out.println("找不到目标学生");
}
在查找学生、删除学生、更新学生信息和查询学生信息的方法中,使用 if - else 语句判断是否找到了目标学生,并根据结果执行相应的操作。条件语句是程序中进行逻辑判断的重要工具,能够根据不同的条件执行不同的代码块。
(五)方法封装
1. 方法的定义和调用
// 输出操作提示
public void prompt() {
System.out.println("********************");
System.out.println(" 学生管理系统");
System.out.println("********************");
System.out.println("(1) 添加学生");
System.out.println("(2) 删除学生");
System.out.println("(3) 更新信息");
System.out.println("(4) 查询学生");
System.out.println("(0) 退出系统");
System.out.println("********************");
System.out.print("请选择你的操作: ");
}
// ...
sm.prompt();
把不同的功能封装成不同的方法,例如 prompt() 方法用于输出操作提示,addStudent() 方法用于添加学生等。在 main 方法中调用这些方法来实现系统的各项功能,这样提高了代码的可读性和可维护性。每个方法只负责单一的功能,便于代码的修改和扩展。
源码
import java.util.Scanner;
// 学生类
class Student {
private String name;
private int age;
private String gender;
// 无参构造器
public Student() {
}
// 有参构造器
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// getter和setter方法
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
// 学生管理系统类
public class StudentManagement {
// 学生对象数组
private Student[] stus;
// 实际学生个数
private int counter;
// 键盘录入对象
private Scanner in;
// 无参构造器:默认容量100
public StudentManagement() {
stus = new Student[100];
in = new Scanner(System.in);
}
// 有参构造器:size表示初始容量
public StudentManagement(int size) {
stus = new Student[size];
in = new Scanner(System.in);
}
// 输出操作提示
public void prompt() {
System.out.println("********************");
System.out.println(" 学生管理系统");
System.out.println("********************");
System.out.println("(1) 添加学生");
System.out.println("(2) 删除学生");
System.out.println("(3) 更新信息");
System.out.println("(4) 查询学生");
System.out.println("(0) 退出系统");
System.out.println("********************");
System.out.print("请选择你的操作: ");
}
// 根据用户录入的学生名称,找到学生在数组中的索引返回
private int findStudent() {
int index = -1;
System.out.print("请输入姓名: ");
String name = in.next();
for (int i = 0; i < counter; i++) {
if (stus[i] != null && stus[i].getName().equals(name)) {
index = i;
break;
}
}
return index;
}
// 添加学生
public void addStudent() {
System.out.print("请输入姓名: ");
String name = in.next();
System.out.print("请输入年龄: ");
int age = in.nextInt();
System.out.print("请输入性别: ");
String gender = in.next();
if (counter < stus.length) {
stus[counter] = new Student(name, age, gender);
counter++;
System.out.println("添加成功");
} else {
// 创建一个新数组,容量为原数组的2倍
Student[] newStus = new Student[stus.length * 2];
// 将原数组内容复制到新数组
for (int i = 0; i < stus.length; i++) {
newStus[i] = stus[i];
}
// 将新数组赋值给原数组引用
stus = newStus;
// 添加新学生到新数组
stus[counter] = new Student(name, age, gender);
counter++;
System.out.println("添加成功(数组已扩容)");
}
}
// 删除学生
public void deleteStudent() {
int index = findStudent();
if (index != -1) {
for (int i = index; i < counter - 1; i++) {
stus[i] = stus[i + 1];
}
stus[counter - 1] = null;
counter--;
System.out.println("删除成功");
} else {
System.out.println("找不到目标学生");
}
}
// 更新学生信息
public void updateStudent() {
int index = findStudent();
if (index != -1) {
System.out.print("请输入新的年龄: ");
int age = in.nextInt();
System.out.print("请输入新的性别: ");
String gender = in.next();
stus[index].setAge(age);
stus[index].setGender(gender);
System.out.println("更新成功");
} else {
System.out.println("找不到目标学生");
}
}
// 查询学生信息
public void selectStudent() {
int index = findStudent();
if (index != -1) {
Student s = stus[index];
System.out.println("Name: " + s.getName());
System.out.println("Age: " + s.getAge());
System.out.println("Gender: " + s.getGender());
} else {
System.out.println("找不到目标学生");
}
}
public static void main(String[] args) {
// 实例化对象
StudentManagement sm = new StudentManagement();
// 用户操作标志
int option = -1;
Loop: while (true) {
// 打印提示信息
sm.prompt();
// 获取用户操作
option = sm.in.nextInt();
if (option < 0 || option > 4) {
System.out.println("错误操作,请重试");
continue;
}
switch (option) {
case 1:
sm.addStudent();
break;
case 2:
sm.deleteStudent();
break;
case 3:
sm.updateStudent();
break;
case 4:
sm.selectStudent();
break;
case 0:
break Loop;
}
}
System.out.println("游戏结束,再见");
}
}
更多推荐
所有评论(0)