Java面向对象思想实现学生管理系统
一、题目介绍:
二、需求分析
- 学生和老师之间有一些共同的成员属性和成员方法,可以将他们的共同方法抽象成person父类,定义student子类和teacher子类继承person的成员属性,重写person中的抽象方法。
2.定义工具类,在工具类中实现以下方法,供测试类调用:
1)id的静态代码块,用于id的自动编码
2)定义通过出身日期计算年龄的方法,用于根据出生日期自动获取年龄
3) 打印ArrayList<? extends Person>的方法,用于接受一个集合,然后遍历集合的成员对象
4) 打印Person的方法,用于接受一个对象,然后打印对象的成员属性等相关信息
3.定义测试类
根据需求,信息管理系统分为两层结构,第1层用于选择是操作学生管理系统,还是教师管理系统。第2层嵌套在第1层结构里面用于实现用户对学员/教师管理系统的增删查改,在第2层中,通过调用封装的增删查改功能的方法来实现用户对学员/教师管理系统的增删查改。
4.信息管理系统的总体架构
三、代码实现:
1.定义person抽象父类
//定义Person父类
public abstract class Demo_Person {
//成员属性
private int Id;
private String name;
private String sex;
private String birthday;
private int age;
//构造方法
public Demo_Person() { }
public Demo_Person(int Id,String name, String sex, String birthday) {
this.Id=Id;
this.name = name;
this.sex = sex;
this.birthday = birthday;
}
//get和set方法
public int getId() return Id;
public void setId(int id) {
this.Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
//重载tostring
@Override
public String toString() {
return Id +
"\t\t" + name +
"\t\t" + sex +
"\t\t" + birthday +
"\t\t" + Utils_demo.birthdayToAge(birthday) +
"\t\t我是一名:" + getType() +
",我的工作是:" + getInfo();
}
//拓展问题:在继承中,toString方法,hashcode()和equal()方法是重写在父类较好,还是写在子类?
//答:这要看具体情况,如果所有子类的行为都一样,就写在父类中,如果子类不同,就写在子类中
//成员方法
//1.获取成员类型
public abstract String getType();
//2.获取成员描述
public abstract String getInfo();
}
2.定义学生子类
public class Demo_Students extends Demo_Person {
//学生类构造方法
public Demo_Students() {
}
public Demo_Students(int Id, String name, String sex, String birthday) {
super(Id, name, sex, birthday);
}
//重写person抽象方法
@Override
public String getType() {
return "学生";
}
@Override
public String getInfo() {
return "学习java";
}
}
3.定义教师子类
public class Teacher_Demo extends Demo_Person {
//构造函数
public Teacher_Demo() {
}
public Teacher_Demo(int Id, String name, String sex, String birthday) {
super(Id, name, sex, birthday);
}
//抽象方法重载
@Override
public String getType() {
return "老师";
}
@Override
public String getInfo() {
return "教java";
}
}
4.定义工具类
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class Utils_demo {
public static int studentId;
public static int teacherId;
static {
studentId = 0;
teacherId = 0;
}
//定义通过出身日期计算年龄的方法:用字符串的生日,计算出他的年龄
public static int birthdayToAge(String birthday) {
//1.判断当前日期是否在生日日期之前,是:错误*********
Date birthDate = null;
try {
birthDate = new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
return -1;
}
//获取当前系统时间
Calendar cal = Calendar.getInstance();
//将"生日"的date转换为Calendar
Calendar birthCalendar = Calendar.getInstance();
birthCalendar.setTime(birthDate);
//如果出生日期大于当前日期,则抛出异常
if (cal.before(birthCalendar)) {
return -1;
}
//取出系统当前时间的年、月、日部分
int yearNow = cal.get(Calendar.YEAR);
int monthNow = cal.get(Calendar.MONTH);
int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
//取出出生日期的年、月、日部分
int yearBirth = birthCalendar.get(Calendar.YEAR);
int monthBirth = birthCalendar.get(Calendar.MONTH);
int dayOfMonthBirth = birthCalendar.get(Calendar.DAY_OF_MONTH);
//当前年龄与出生年份相减,初步计算年龄
int age = yearNow - yearBirth;
//当前月份与出身日期的月份相比,如果月份小于出生月份,则年龄上减1,表示不满多少周岁
if (monthNow <= monthBirth) {
if (monthNow == monthBirth) {
//如果月份相等,在比较日期,如果当前日,小于出身日,也减1,表示不满多少周岁
if (dayOfMonthNow < dayOfMonthBirth) {
age--;
} else {
age--;
}
}
}
return age;
}
//打印ArrayList<? extends Person>的方法
public static void printPerson(ArrayList<? extends Demo_Person> personList) {
System.out.println("************************************************************************************");
System.out.println("编号\t\t姓名\t\t性别\t\t生日\t\t\t年龄\t\t描述");
System.out.println("------------------------------------------------------------------------------------");
if (personList == null || personList.size() == 0) {
System.out.println("【无数据】");
} else {
for (int i = 0; i < personList.size(); i++) {
Demo_Person p = personList.get(i);
System.out.println(p);
}
}
System.out.println("****************************");
}
public static void printPerson(Demo_Person person){
System.out.println("************************************************************************************");
System.out.println("编号\t\t姓名\t\t性别\t\t生日\t\t\t年龄\t\t描述");
System.out.println(person );
System.out.println("************************************************************************************");
}
}
5.定义测试类
import com.itheima.students.Demo_Students;
import com.itheima.teacher.Teacher_Demo;
import com.itheima.utils.Utils_demo;
import java.util.ArrayList;
import java.util.Scanner;
public class Main_Demo {
public static void main(String[] args) {
//1.一级菜单
Scanner scanner = new Scanner(System.in);
//创建学生集合
ArrayList<Demo_Students> studentList = new ArrayList<>();
//创建老师集合
ArrayList<Teacher_Demo> teacherList = new ArrayList<>();
while (true) {
System.out.println("**************************************");
System.out.println("1.学员信息管理 2.教师信息管理 3.退出");
System.out.println("**************************************");
String op = scanner.next();
switch (op) {
case "1":
//1)学生管理系统
StudentManagerSystem(scanner, studentList);
break;
//2)老师管理系统
case "2":
TeacherManagerSystem(scanner, teacherList);
break;
//3)退出
case "3":
System.out.println("谢谢使用,拜拜");
System.exit(0);
break;
default:
System.out.println("你的输入有问题,请重输!");
}
}
}
private static void StudentManagerSystem(Scanner scanner, ArrayList<Demo_Students> studentList) {
while (true) {
System.out.println("********************************************************");
System.out.println("1.添加学员 2.修改学员 3.删除学员 4.查询学员 5.返回");
System.out.println("********************************************************");
String op = scanner.next();
switch (op) {
case "1":
//1)添加学员
StudentAdd(scanner, studentList);
break;
case "2":
//2)修改学员
StudentAlter(scanner, studentList);
break;
case "3":
//3)删除学员
StudentDelete(scanner, studentList);
break;
//4)查询学员
case "4":
StudentFind(scanner, studentList);
break;
//5)退出
case "5":
return;
default:
System.out.println("你的输入有问题,请重输!");
break;
}
}
}
private static void TeacherManagerSystem(Scanner scanner, ArrayList<Teacher_Demo> teacherList) {
while (true) {
System.out.println("********************************************************");
System.out.println("1.添加老师 2.修改老师 3.删除老师 4.查询老师 5.返回");
System.out.println("********************************************************");
String op = scanner.next();
switch (op) {
case "1":
//1)添加老师
TeacherAdd(scanner, teacherList);
break;
case "2":
//2)修改老师
TeacherAlter(scanner, teacherList);
break;
case "3":
//3)删除老师
TeacherDelete(scanner, teacherList);
break;
//4)查询老师
case "4":
TeacherFind(scanner, teacherList);
break;
//5)退出
case "5":
return;
default:
System.out.println("你的输入有问题,请重输!");
break;
}
}
}
//学生系统封装方法
private static void StudentAdd(Scanner scanner, ArrayList<Demo_Students> studentList) {
System.out.println("请输入你的姓名:");
String name = scanner.next();
System.out.println("请输入你的性别:");
String sex = scanner.next();
System.out.println("请输入你的出生年月(yyyy-MM-dd):");
String birthday = scanner.next();
//创建一个Student对象
Demo_Students stu = new Demo_Students();
stu.setId(++Utils_demo.studentId);
stu.setName(name);
stu.setSex(sex);
stu.setBirthday(birthday);
//将对象存储到集合
studentList.add(stu);
//提示成功
System.out.println("【成功】数据已被保存!");
}
private static void StudentAlter(Scanner scanner, ArrayList<Demo_Students> studentList) {
System.out.println("请输入要修改的成员ID:");
int id = scanner.nextInt();
//遍历集合,查找这个id
for (int i = 0; i < studentList.size(); i++) {
Demo_Students stu = studentList.get(i);
if (stu.getId() == id) {
//找到
//1.回显数据
System.out.println("【查询结果】");
Utils_demo.printPerson(stu);
//2.执行修改
System.out.println("请输入新姓名[保留原值为0]");
String newName = scanner.next();
System.out.println("请输入新性别[保留原值为0]");
String newSex = scanner.next();
System.out.println("请输入新生日[保留原值为0]");
String newBirthday = scanner.next();
//判断,并执行修改
if (!"0".equals(newName)) {
stu.setName(newName);
}
if (!"0".equals(newSex)) {
stu.setName(newSex);
}
if (!"0".equals(newBirthday)) {
stu.setName(newBirthday);
}
//3.打印成功,结束方法
System.out.println("【成功】数据已被修改!");
return;
}
}
//只要执行到这里,就表示循环自然结束,没找到!!
System.out.println("学员ID:" + id + " 没找到!");
}
private static void StudentDelete(Scanner scanner, ArrayList<Demo_Students> studentList) {
System.out.println("请输入要修改的成员ID:");
int id = scanner.nextInt();
//遍历集合,查找这个id
for (int i = 0; i < studentList.size(); i++) {
Demo_Students stu = studentList.get(i);
if (stu.getId() == id) {
//找到
//1.回显数据
System.out.println("【查询结果】");
Utils_demo.printPerson(stu);
//2.确认删除
System.out.println("【确认删除】您确定要删除这条记录吗?(y/n):");
String op= scanner.next();
if (!"y".equals(op)){
System.out.println("【取消】操作被取消!");
return;
}else {
//执行删除
studentList.remove(stu);
//4.提示成功,返回
System.out.println("【成功】数据已被删除!");
return;
}
}
}
//只要执行到这里,就表示循环自然结束,没找到!!
System.out.println("【错误】学员ID:" + id + " 没找到!");
}
private static void StudentFind(Scanner scanner, ArrayList<Demo_Students> studentList) {
Utils_demo.printPerson(studentList);
}
//老师系统封装方法
private static void TeacherAdd(Scanner scanner, ArrayList<Teacher_Demo> teacherList) {
System.out.println("请输入你的姓名:");
String name = scanner.next();
System.out.println("请输入你的性别:");
String sex = scanner.next();
System.out.println("请输入你的出生年月(yyyy-MM-dd):");
String birthday = scanner.next();
//创建一个Student对象
Teacher_Demo tea = new Teacher_Demo();
tea.setId(++Utils_demo.studentId);
tea.setName(name);
tea.setSex(sex);
tea.setBirthday(birthday);
//将对象存储到集合
teacherList.add(tea);
//提示成功
System.out.println("【成功】数据已被保存!");
}
private static void TeacherAlter(Scanner scanner, ArrayList<Teacher_Demo> teacherList) {
System.out.println("请输入要修改的成员ID:");
int id = scanner.nextInt();
//遍历集合,查找这个id
for (int i = 0; i < teacherList.size(); i++) {
Teacher_Demo tea = teacherList.get(i);
if (tea.getId() == id) {
//找到
//1.回显数据
System.out.println("【查询结果】");
Utils_demo.printPerson(tea);
//2.执行修改
System.out.println("请输入新姓名[保留原值为0]");
String newName = scanner.next();
System.out.println("请输入新性别[保留原值为0]");
String newSex = scanner.next();
System.out.println("请输入新生日[保留原值为0]");
String newBirthday = scanner.next();
//判断,并执行修改
if (!"0".equals(newName)) {
tea.setName(newName);
}
if (!"0".equals(newSex)) {
tea.setName(newSex);
}
if (!"0".equals(newBirthday)) {
tea.setName(newBirthday);
}
//3.打印成功,结束方法
System.out.println("【成功】数据已被修改!");
return;
}
}
//只要执行到这里,就表示循环自然结束,没找到!!
System.out.println("学员ID:" + id + " 没找到!");
}
private static void TeacherDelete(Scanner scanner, ArrayList<Teacher_Demo> teacherList) {
System.out.println("请输入要修改的成员ID:");
int id = scanner.nextInt();
//遍历集合,查找这个id
for (int i = 0; i < teacherList.size(); i++) {
Teacher_Demo tea = teacherList.get(i);
if (tea.getId() == id) {
//找到
//1.回显数据
System.out.println("【查询结果】");
Utils_demo.printPerson(tea);
//2.确认删除
System.out.println("【确认删除】您确定要删除这条记录吗?(y/n):");
String op= scanner.next();
if (!"y".equals(op)){
System.out.println("【取消】操作被取消!");
return;
}else {
//执行删除
teacherList.remove(tea);
//4.提示成功,返回
System.out.println("【成功】数据已被删除!");
return;
}
}
}
//只要执行到这里,就表示循环自然结束,没找到!!
System.out.println("【错误】学员ID:" + id + " 没找到!");
}
private static void TeacherFind(Scanner scanner, ArrayList<Teacher_Demo> teacherList) {
Utils_demo.printPerson(teacherList);
}
}