今日内容

  • 案例演示
  • 设计类
  • 制作类
  • 实现功能(对学生信息的增删查改的功能)

教学目标

  • 能够编写主菜单
  • 能够定义Person类并应用模板模式
  • 能够定义子类Student类并添加特有成员
  • 能够定义子类Teacher类并添加特有成员
  • 能够理解继承在案例中的使用
  • 能够理解模板模式在案例中的使用
  • 能够定义并使用打印Person的静态方法
  • 能够定义并使用打印ArrayList的静态方法
  • 能够理解静态成员变量和静态方法在案例中的使用

第一章 案例演示

目标:

  • 今天我们要来做一个综合案例,就是学生信息管理系统,接下来我们来演示一下有哪些功能

路径:

  • 程序启动
  • 测试学员信息管理模块
  • 测试【1.查询学员】
  • 测试【2.添加学员】
  • 测试【2.修改学员】
  • 测试【4.删除学员】

讲解:

1.1 程序启动

运行com.itheima.main.MainApp类,启动程序:

day06 【综合练习】 - 图1

1.2 测试学员信息管理模块

day06 【综合练习】 - 图2

1.3 测试【4.查询学员】

day06 【综合练习】 - 图3

1.4 测试【1.添加学员】

day06 【综合练习】 - 图4

1.5 测试【2.修改学员】

  • 输入不存在的编号:
    day06 【综合练习】 - 图5

  • 输入存在的编号:
    day06 【综合练习】 - 图6

1.6 测试【3.删除学员】

  • 输入不存在的编号:
    day06 【综合练习】 - 图7

  • 输入存在的编号,但取消操作:
    day06 【综合练习】 - 图8

  • 输入存在的编号,执行删除:
    day06 【综合练习】 - 图9

业务逻辑分析:

day06 【综合练习】 - 图10

小结:

第二章 类设计

day06 【综合练习】 - 图11

2.1 父类Person(抽象)

目标:

  • 有学生信息管理和教师信息管理 系统,所以可以使用模板设计模式,定义一个父类,把共有的部分放在Person类中

路径:

  • 分析Person类中的成员

讲解:

  • 成员属性:

    • id(编号)
    • name(姓名)
    • sex(性别)
    • birthday(生日)
    • age(年龄-由生日计算得出)
  • 构造方法:

    • 无参构造
    • 全参构造
  • 成员方法:

    • toString()
  • 抽象方法:

    • getType():由各子类实现,返回各自的”类型”字符串。
    • getWork():由各子类实现,返回各自的”工作”字符串。

小结:

2.2 子类Student

目标:

  • 分析子类Student

路径:

  • 分析Student类中的成员

讲解:

  • 构造方法

    • 无参构造
    • 全参构造(super调用父类全参构造)
  • 重写抽象方法

    • 重写getType()
    • 重写getWork()

小结:

2.3 子类Teacher

目标:

  • 分析子类Teacher

步骤:

  • 分析Teacher类中的成员

讲解:

  • 构造方法

    • 无参构造
    • 全参构造(super调用父类全参构造)
  • 重写抽象方法

    • 重写getType()
    • 重写getWork()

小结:

2.4 工具类Utils类

目标:

  • 添加学员或者教师信息时,ID值+1,还有查询的时候需要打印集合信息以及计算年龄的功能,这些都是通用的,所以可以把这些定义在工具类中

路径:

  • 分析工具类中的成员

讲解:

  • 全局变量

    • 学员ID值(添加学员信息时,编号由此ID加1生成)
    • 教师ID值(添加教师信息时,编号由此ID加1生成)
  • 全局方法

    • 根据生日计算年龄的方法
    • 打印一个Person对象的方法;
    • 打印一个ArrayList集合的方法;

小结:

2.5 启动类

目标:

  • 创建启动类,定义main方法

步骤:

  • 创建启动类,定义main方法

讲解:

  • 定义启动类:MainApp启动程序。

小结:

第三章 类制作

目标:

  • 根据之前的分析,分别制作Person,Student,Teacher,Utils类

步骤:

  • 制作父类Person(抽象)
  • 制作子类Student
  • 制作子类Teacher
  • 制作工具类Utils类

讲解:

3.1 父类Person(抽象)

  1. public abstract class Person {
  2. // 成员变量
  3. /**
  4. * 编号
  5. */
  6. private int id;
  7. /**
  8. * 姓名
  9. */
  10. private String name;
  11. /**
  12. * 性别
  13. */
  14. private String sex;
  15. /**
  16. * 生日
  17. */
  18. private String birthday;
  19. /**
  20. * 年龄
  21. */
  22. private int age;
  23. // 构造方法
  24. public Person() {
  25. }
  26. public Person(int id, String name, String sex, String birthday, int age) {
  27. this.id = id;
  28. this.name = name;
  29. this.sex = sex;
  30. this.birthday = birthday;
  31. this.age = age;
  32. }
  33. // set\get方法
  34. public int getId() {
  35. return id;
  36. }
  37. public void setId(int id) {
  38. this.id = id;
  39. }
  40. public String getName() {
  41. return name;
  42. }
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46. public String getSex() {
  47. return sex;
  48. }
  49. public void setSex(String sex) {
  50. this.sex = sex;
  51. }
  52. public String getBirthday() {
  53. return birthday;
  54. }
  55. public void setBirthday(String birthday) {
  56. this.birthday = birthday;
  57. }
  58. public int getAge() {
  59. return age;
  60. }
  61. public void setAge(int age) {
  62. this.age = age;
  63. }
  64. // 成员方法
  65. /**
  66. * @return 返回类型
  67. */
  68. public abstract String getType();
  69. /**
  70. * @return 返回工作
  71. */
  72. public abstract String getWork();
  73. /**
  74. * 按照指定格式,返回数据信息
  75. * @return
  76. */
  77. public String show(){
  78. return "我是一名:"+getType()+",我的工作是:"+getWork();
  79. }
  80. }

3.2 子类Student

  1. public class Student extends Person {
  2. public Student() {
  3. }
  4. public Student(int id, String name, String sex, String birthday, int age) {
  5. super(id, name, sex, birthday, age);
  6. }
  7. @Override
  8. public String getType() {
  9. return "学生";
  10. }
  11. @Override
  12. public String getWork() {
  13. return "学Java...";
  14. }
  15. }

3.3 子类Teacher

  1. public class Teacher extends Person {
  2. public Teacher() {
  3. }
  4. public Teacher(int id, String name, String sex, String birthday, int age) {
  5. super(id, name, sex, birthday, age);
  6. }
  7. @Override
  8. public String getType() {
  9. return "老师";
  10. }
  11. @Override
  12. public String getWork() {
  13. return "教Java...";
  14. }
  15. }

3.4 工具类Utils类

  1. public class Utils {
  2. // 定义一个静态的id变量,用来给学生对象的id赋值
  3. public static int id ;// 100个对象 id=100 程序停止再启动
  4. static {
  5. id = 0;// 以后可以读取文件中记录的id值,赋为初始值
  6. }
  7. // 根据生日计算年龄的方法
  8. public static int birthdayToAge(String birthday){
  9. // 思路:
  10. // 1. 获取当前日期对象
  11. Date nowDate = new Date();
  12. // 2. 创建日期格式化对象,指定日期格式
  13. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  14. // 3. 调用parse()解析方法对字符串生日解析为Date类型的生日
  15. Date birthdayDate = null;
  16. try {
  17. birthdayDate = sdf.parse(birthday);
  18. } catch (ParseException e) {
  19. e.printStackTrace();
  20. }
  21. // 4.比较出生日期是否在当前日期之后,如果是,直接返回 -1;
  22. if (birthdayDate.after(nowDate)) {
  23. return -1;
  24. }
  25. // 5.获取当前时间的日历对象
  26. Calendar cal = Calendar.getInstance();
  27. // 6.获取当前时间的年,月,日
  28. int nowYear = cal.get(Calendar.YEAR);
  29. int nowMonth = cal.get(Calendar.MONTH);
  30. int nowDay = cal.get(Calendar.DAY_OF_MONTH);
  31. // 7.通过日历对象调用setTime(Date date)方法,设置日历对象的时间为出生日期的时间
  32. cal.setTime(birthdayDate);
  33. // 8.通过设置之后的日历对象获取生日的年,月,日
  34. int birthdayYear = cal.get(Calendar.YEAR);
  35. int birthdayMonth = cal.get(Calendar.MONTH);
  36. int birthdayDay = cal.get(Calendar.DAY_OF_MONTH);
  37. // 9.使用当前时间的年 - 生日的年 得到一个初步的年龄
  38. int age = nowYear - birthdayYear;
  39. // 10.如果当前时间的月 小于 生日的月份,那么初步年龄-1
  40. if (nowMonth < birthdayMonth){
  41. age--;
  42. }
  43. // 11.如果当前时间的月 等于生日的月份,但当前时间的日 小于 生日的日,那么初步年龄-1
  44. if (nowMonth == birthdayMonth){
  45. if (nowDay < birthdayDay){
  46. age--;
  47. }
  48. }
  49. // 10.直接返回年龄
  50. return age;
  51. }
  52. // 打印Person对象
  53. public static void printPerson(Person p){
  54. System.out.println(p.getId()+"\t\t"+p.getName()+
  55. "\t\t"+p.getSex()+"\t\t"+p.getBirthday()+
  56. "\t\t"+p.getAge()+"\t\t"+p.show());
  57. }
  58. // 打印集合所有元素
  59. public static void printArrayList(ArrayList list){
  60. System.out.println("**************************************************************************");
  61. System.out.println("编号\t\t姓名\t\t性别\t\t生日\t\t\t\t年龄\t\t描述");
  62. // 循环遍历集合
  63. for (int i = 0; i < list.size(); i++) {
  64. // 获取集合元素
  65. Person p = (Person) list.get(i);
  66. // 打印对象
  67. printPerson(p);
  68. }
  69. System.out.println("**************************************************************************");
  70. }
  71. }

小结:

第四章 启动类实现

目标:

  • 启动类实现

步骤:

  • 主菜单(一级菜单)
  • 学员信息管理二级菜单
  • 实现学员信息管理二级菜单—-查询所有学员
  • 实现学员信息管理二级菜单—-添加学员
  • 实现学员信息管理二级菜单—-修改学员
  • 实现学员信息管理二级菜单—-删除学员

讲解:

4.1 主菜单

  1. public class MainApp {
  2. public static void main(String[] args) {
  3. Scanner sc = new Scanner(System.in);
  4. //学生集合
  5. ArrayList<Student> stuList = new ArrayList<>();
  6. //教师集合
  7. ArrayList<Teacher> teaList = new ArrayList<>();
  8. //主菜单
  9. while (true) {
  10. System.out.println("1.学员信息管理 2.教师信息管理 3.退出");
  11. int op = sc.nextInt();
  12. switch (op) {
  13. case 1:
  14. studentManage(stuList,sc);
  15. break;
  16. case 2:
  17. teacherManage(teaList,sc);
  18. break;
  19. case 3:
  20. System.out.println("谢谢使用,拜拜!!");
  21. System.exit(0);
  22. default:
  23. System.out.println("你的输入有误,请重新输入!");
  24. break;
  25. }
  26. }
  27. }
  28. //教师信息管理
  29. private static void teacherManage(ArrayList<Teacher> teaList,Scanner sc) {
  30. }
  31. //学员信息管理
  32. private static void studentManage(ArrayList<Student> stuList,Scanner sc) {
  33. }
  34. }

4.2 学员信息管理二级菜单

  1. public class MainApp {
  2. public static void main(String[] args) {
  3. // 创建Scanner对象,用于键盘录入数据
  4. Scanner sc = new Scanner(System.in);
  5. // 创建ArrayList集合,用来存储学生对象
  6. ArrayList<Student> stuList = new ArrayList<>();
  7. // 创建ArrayList集合,用来存储老师对象
  8. ArrayList<Teacher> teaList = new ArrayList<>();
  9. // 循环生成一级菜单
  10. while (true) {
  11. System.out.println("1 学员信息管理 2 教师信息管理 3 系统退出");
  12. int num = sc.nextInt();
  13. switch (num) {
  14. case 1:
  15. // 进入学员信息管理系统 二级菜单
  16. studentManage(stuList, sc);
  17. break;
  18. case 2:
  19. // 进入教师信息管理系统 二级菜单
  20. teacherManage(teaList, sc);
  21. break;
  22. case 3:
  23. // 系统退出
  24. System.exit(0);// 程序终止,退出
  25. break;
  26. default:
  27. System.out.println("您输入的有误,请重新输入!");
  28. break;
  29. }
  30. }
  31. }
  32. //教师信息管理
  33. private static void teacherManage(ArrayList<Teacher> teaList,Scanner sc) {
  34. }
  35. //学员信息管理
  36. private static void studentManage(ArrayList<Student> stuList, Scanner sc) {
  37. while (true) {
  38. System.out.println("---------------------------------------------");
  39. System.out.println("【学员信息管理】");
  40. System.out.println("1.添加学员 2.查询学员 3.修改学员 4.删除学员 5.返回");
  41. System.out.println();
  42. System.out.println("请输入功能序号:");
  43. int num = sc.nextInt();
  44. // 根据用户输入的序号,进行对应的操作
  45. switch (num) {
  46. case 1:
  47. // 添加学员
  48. addStudent(stuList, sc);
  49. break;
  50. case 2:
  51. // 查询学员
  52. selectStudent(stuList, sc);
  53. break;
  54. case 3:
  55. // 修改学员
  56. updateStudent(stuList, sc);
  57. break;
  58. case 4:
  59. // 删除学员
  60. deleteStudent(stuList, sc);
  61. break;
  62. case 5:
  63. // 返回
  64. return;// 结束方法
  65. default:
  66. System.out.println("您输入的功能序号有误,请重新输入!");
  67. break;
  68. }
  69. }
  70. }
  71. //添加学员
  72. private static void v(ArrayList<Student> stuList, Scanner sc) {
  73. }
  74. //修改学员
  75. private static void updateStudent(ArrayList<Student> stuList, Scanner sc) {
  76. }
  77. //删除学员
  78. private static void deleteStudent(ArrayList<Student> stuList, Scanner sc) {
  79. }
  80. //查询所有学员
  81. private static void selectStudent(ArrayList<Student> stuList, Scanner sc) {
  82. }
  83. }

4.3 查询所有学员

  1. //查询所有学员
  2. private static void selectStudent(ArrayList<Student> stuList, Scanner sc) {
  3. System.out.println("【查询结果:】");
  4. // 如果集合中没有数据,就显示没有数据,结束方法
  5. if (stuList.size() == 0) {
  6. System.out.println("没有数据...");
  7. return;
  8. }
  9. Utils.printList(stuList);
  10. }

4.4 添加学员

  1. //添加学员
  2. private static void addStudent(ArrayList<Student> stuList, Scanner sc) {
  3. // next()方法不会获取回车或者空格,或者tab键 ,而nextLine会获取
  4. System.out.println("请输入学员姓名:");
  5. String name = sc.next();
  6. System.out.println("请输入学员性别:");
  7. String sex = sc.next();
  8. System.out.println("请输入出生日期,格式为yyyy-MM-dd:");
  9. String birthday = sc.next();
  10. // 创建一个Student对象
  11. Student stu = new Student();
  12. // 给Student对象赋值
  13. stu.setId(++Utils.sid);
  14. stu.setName(name);
  15. stu.setSex(sex);
  16. stu.setBirthday(birthday);
  17. // 调用工具类方法根据出生日期计算年龄
  18. int age = Utils.birthdayToAge(birthday);
  19. stu.setAge(age);
  20. // 把该Student对象,添加到stuList集合中
  21. stuList.add(stu);
  22. System.out.println("添加元素成功...");
  23. }

4.5 修改学员

  1. //修改学员
  2. private static void updateStudent(ArrayList<Student> stuList, Scanner sc) {
  3. System.out.println("请输入要修改学员的编号:");
  4. // 获取用户输入的学生编号
  5. int num = sc.nextInt();
  6. // 判断stuList集合中是否存在该学员编号
  7. // 循环遍历stuList集合,获取集合中的元素
  8. for (int i = 0; i < stuList.size(); i++) {
  9. Student stu = stuList.get(i);
  10. // 如果存在该学员编号,就进行修改,修改完了之后保存信息,结束方法
  11. if (stu.getId() == num) {
  12. //获取用户输入的修改信息
  13. System.out.println("请输入学员姓名(保留原值输入0):");
  14. String name = sc.next();
  15. System.out.println("请输入学员性别(保留原值输入0):");
  16. String sex = sc.next();
  17. System.out.println("请输入学员出生日期,格式为yyyy-MM-dd :");
  18. String birthday = sc.next();
  19. // 判断修改
  20. if (!"0".equals(name)) {
  21. // 输入的一定不是0
  22. stu.setName(name);
  23. }
  24. if (!"0".equals(sex)) {
  25. stu.setSex(sex);
  26. }
  27. if (!"0".equals(birthday)) {
  28. stu.setBirthday(birthday);
  29. stu.setAge(Utils.birthdayToAge(birthday));
  30. }
  31. System.out.println("修改成功");
  32. // 结束方法
  33. return;
  34. }
  35. }
  36. // 如果不存在该学员编号,输出错误信息,结束方法
  37. System.out.println("【错误】学员ID:" + num + " 未找到!");
  38. }

4.6 删除学员

  1. //删除学员
  2. private static void deleteStudent(ArrayList<Student> stuList, Scanner sc) {
  3. System.out.println("请输入要删除学员的编号:");
  4. // 1.获取用户输入的学员编号
  5. int num = sc.nextInt();
  6. // 2.判断stuList集合中是否存在该学员编号
  7. for (int i = 0; i < stuList.size(); i++) {
  8. // 获取集合中的元素
  9. Student stu = stuList.get(i);
  10. if (stu.getId() == num) {
  11. // 2.1 如果存在该学员编号,就输出该学员信息,并提示是否删除
  12. System.out.println("【查询结果】要删除的学员信息:");
  13. Utils.printPerson(stu);
  14. System.out.println("【确认】您确定要删除这条信息吗(y/n),y代表删除,n代表取消删除:");
  15. // 获取用户输入
  16. String str = sc.next();
  17. // 2.1.1 如果用户输入的是y,就直接删除,提示删除成功,结束方法
  18. if("y".equals(str)){
  19. stuList.remove(i);// 根据索引删除元素
  20. System.out.println("删除成功!");
  21. }
  22. // 2.1.2 如果用户输入的是n,就不删除,提示取消删除,结束方法
  23. if("n".equals(str)){
  24. System.out.println("【取消】删除操作被取消!");
  25. }
  26. return;
  27. }
  28. }
  29. // 2.2 如果不存在该学员编号,就提示错误信息,结束方法
  30. System.out.println("【错误】学员ID:" + num + " 未找到!");
  31. }

小结:

总结

  1. - 能够编写主菜单
  2. 死循环--->显示菜单--->获取用户输入的功能序号--->根据输入的功能序号进入二级菜单
  3. - 能够定义Person类并应用模板模式
  4. 抽象类---> public String show(){} 通用模板 getType() getWork()填充模板
  5. - 能够定义子类Student类并添加特有成员
  6. Student类继承Person类,重写getType()和getWork()方法
  7. - 能够定义子类Teacher类并添加特有成员
  8. Teachert类继承Person类,重写getType()和getWork()方法
  9. - 能够理解继承在案例中的使用
  10. Student\Teacher 继承Person
  11. - 能够定义并使用打印Person的静态方法
  12. public static void printPerson(Person p){}
  13. - 能够定义并使用打印ArrayList的静态方法
  14. public static void printArrayList(ArrayList list){}
  15. - 能够理解静态成员变量和静态方法在案例中的使用
  16. public static int id; 共享
  17. Utils工具类中的静态方法
  18. 静态成员可以实际使用类名直接访问

第五章 课后练习

5.1参考学员管理实现教师管理模块