导学

关于Java面向对象的知识已经学习过一部分了。在近期的学习中,我们遇到了很多的概念和知识点。在本章节内容中,我们就来通过一个简单的案例,运用Java加面向对象的思想,完成一个模拟场景的实现。

案例简介

在某一个学校开设了一个专业,叫做计算机科学与应用,专业编号J0001,学制为4年。
有四名学生报名学习了本专业,每个人的具体信息如下所示:
3. 综合案例-学生信息管理 - 图1
通过Java面向对象的语言来实现这样的场景,最后输出的内容如下所示:
3. 综合案例-学生信息管理 - 图2

案例分析与实现

通过对该场景的分析,我们可以得到这样的两个类
3. 综合案例-学生信息管理 - 图3

编写专业类及其测试类

  1. package com.dodoke.school.model;
  2. /**
  3. * 专业类
  4. * @author LiXinRong
  5. *
  6. */
  7. public class Subject {
  8. //成员属性:学科名称、学科编号、学制年限
  9. private String subjectName;
  10. private String subjectNo;
  11. private int subjectLife;
  12. public String getSubjectName() {
  13. return subjectName;
  14. }
  15. public void setSubjectName(String subjectName) {
  16. this.subjectName = subjectName;
  17. }
  18. public String getSubjectNo() {
  19. return subjectNo;
  20. }
  21. public void setSubjectNo(String subjectNo) {
  22. this.subjectNo = subjectNo;
  23. }
  24. public int getSubjectLife() {
  25. return subjectLife;
  26. }
  27. //对于专业学习的时长不能低于0
  28. public void setSubjectLife(int subjectLife) {
  29. if(subjectLife < 0) {
  30. return;//直接使用return退出该setSubjectLife方法,使学制年限保存默认值为0
  31. }
  32. this.subjectLife = subjectLife;
  33. }
  34. public Subject() {
  35. }
  36. public Subject(String subjectName, String subjectNo, int subjectLife) {
  37. super();
  38. this.setSubjectLife(subjectLife);
  39. this.setSubjectName(subjectName);
  40. this.setSubjectNo(subjectNo);
  41. }
  42. /**
  43. * 该方法用于描述专业信息
  44. * @return 返回描述专业相关信息的字符串
  45. * 在真实项目中,对于信息的输出不会利用System.out.println()。
  46. * Java程序一般会提供信息出来,具体的信息输出方式由调用者决定
  47. */
  48. public String info() {
  49. //字符串的拼接,尽量不要写成一长串的形式
  50. String str = "专业信息如下:\n专业名称:" + this.getSubjectName() + "\n";
  51. str += "专业编号:" + this.getSubjectNo() + "\n";
  52. str += "学制年限:" + this.getSubjectNo() + "年";
  53. return str;
  54. }
  55. }

测试类

  1. package com.dodoke.school.test;
  2. import com.dodoke.school.model.Subject;
  3. public class SchoolTest {
  4. public static void main(String[] args) {
  5. Subject sub = new Subject("计算机科学与应用","J0001",4);
  6. //info()方法为什么不直接打印输出:我们现在学习的语言环境是比较简陋的,只用在控制台打印输出信息
  7. //如果需要在网页,在app中输出信息,则返回值为String类型的info()方法,可复用性更高一些
  8. System.out.println(sub.info());
  9. }
  10. }

编写学生类及其测试

  1. package com.dodoke.school.model;
  2. public class Student {
  3. //成员属性:学号,姓名,性别,年龄
  4. private String studentNo;
  5. private String studentName;
  6. private String studentSex;
  7. private int studentAge;
  8. public String getStudentNo() {
  9. return studentNo;
  10. }
  11. public void setStudentNo(String studentNo) {
  12. this.studentNo = studentNo;
  13. }
  14. public String getStudentName() {
  15. return studentName;
  16. }
  17. public void setStudentName(String studentName) {
  18. this.studentName = studentName;
  19. }
  20. public String getStudentSex() {
  21. return studentSex;
  22. }
  23. /**
  24. * 性别限制为男或女,反之,强制限制为男
  25. * @param studentSex
  26. */
  27. //在Java中两个等于号,只能用来判断基本数据类型是否相同
  28. //如果用来比较引用数据类型,比较的是两个引用数据类型在内存中地址是否相同,所以在Java中两个等于号不能判断字符串是否相等
  29. //判断字符串是否相等使用equals方法
  30. public void setStudentSex(String studentSex) {
  31. if(studentSex.equals("男") || studentSex.equals("女")) {
  32. this.studentSex = studentSex;
  33. } else {
  34. this.studentSex = "男";
  35. }
  36. }
  37. public int getStudentAge() {
  38. return studentAge;
  39. }
  40. /**
  41. * 给年龄赋值,限制范围在10-100之间,赋值设置为18岁
  42. * @param studentAge
  43. */
  44. public void setStudentAge(int studentAge) {
  45. if(studentAge > 10 && studentAge < 100) {
  46. this.studentAge = studentAge;
  47. } else {
  48. this.studentAge = 18;
  49. }
  50. }
  51. //无参构造
  52. public Student() {
  53. super();
  54. }
  55. //多参构造,实现对全部属性的赋值
  56. public Student(String studentNo, String studentName, String studentSex, int studentAge) {
  57. super();
  58. this.setStudentNo(studentNo);
  59. this.setStudentName(studentName);
  60. this.setStudentSex(studentSex);
  61. this.setStudentAge(studentAge);
  62. }
  63. /**
  64. * 学生自我介绍
  65. * @return 用于返回描述学生信息字符串
  66. */
  67. public String introduction() {
  68. String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n";
  69. str += "学号:" + this.getStudentNo()+ "\n";
  70. str += "性别:" + this.getStudentSex()+ "\n";
  71. str += "年龄:" + this.getStudentAge();
  72. return str;
  73. }
  74. }

测试:

  1. public class SchoolTest {
  2. public static void main(String[] args) {
  3. Subject sub = new Subject("计算机科学与应用","J0001",4);
  4. //info()方法为什么不直接打印输出:我们现在学习的语言环境是比较简陋的,只用在控制台打印输出信息
  5. //如果需要在网页,在app中输出信息,则返回值为String类型的info()方法,可复用性更高一些
  6. System.out.println(sub.info());
  7. System.out.println("=============================");
  8. Student stu0 = new Student("S01","张三","男", 18);
  9. System.out.println(stu0.introduction());
  10. }
  11. }

专业与学生关联起来

方案一:重载introduction方法,添加专业信息, 直接传入所需参数

  1. /**
  2. * 学生自我介绍 + 所学专业
  3. * @param subjectName 所学专业名称
  4. * @param subjectLife 学制年限
  5. * @return 用于返回描述学生信息和所学专业的字符串
  6. */
  7. public String introduction(String subjectName, int subjectLife) {
  8. String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n";
  9. str += "学号:" + this.getStudentNo()+ "\n";
  10. str += "性别:" + this.getStudentSex()+ "\n";
  11. str += "年龄:" + this.getStudentAge() + "\n";
  12. str += "所报专业名称:" + subjectName + "\n";
  13. str += "学制年限:" + subjectLife + "\n";
  14. return str;
  15. }

关联:

  1. public static void main(String[] args) {
  2. Subject sub = new Subject("计算机科学与应用","J0001",4);
  3. System.out.println(sub.info());
  4. System.out.println("=============================");
  5. Student stu0 = new Student("S01","张三","男", 18);
  6. System.out.println(stu0.introduction());
  7. System.out.println("=============================");
  8. Student stu1 = new Student("S02","李四","女", 19);
  9. System.out.println(stu1.introduction("计算机科学与应用", 4));
  10. }

方案二:重载introduction方法,将专业对象作为参数整体传入

  1. /**
  2. * 学生自我介绍 + 所学专业
  3. * @param sub 专业对象
  4. * @return 用于返回描述学生信息和所学专业的字符串
  5. */
  6. public String introduction(Subject sub) {
  7. String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n";
  8. str += "学号:" + this.getStudentNo()+ "\n";
  9. str += "性别:" + this.getStudentSex()+ "\n";
  10. str += "年龄:" + this.getStudentAge() + "\n";
  11. str += "所报专业名称:" + sub.getSubjectName() + "\n";
  12. str += "学制年限:" + sub.getSubjectLife() + "\n";
  13. return str;
  14. }

关联:

  1. public class SchoolTest {
  2. public static void main(String[] args) {
  3. Subject sub = new Subject("计算机科学与应用","J0001",4);
  4. System.out.println(sub.info());
  5. System.out.println("=============================");
  6. Student stu0 = new Student("S01","张三","男", 18);
  7. System.out.println(stu0.introduction());
  8. System.out.println("=============================");
  9. Student stu1 = new Student("S02","李四","女", 19);
  10. System.out.println(stu1.introduction("计算机科学与应用", 4));
  11. System.out.println("=============================");
  12. Student stu2 = new Student("S03","王五","男", 18);
  13. System.out.println(stu2.introduction(sub));
  14. }
  15. }

通过对象传参,可以一次性的获取对象中的所有信息。比如我们可以在方法中获取对象的专业编号,这是之前方法在不改变参数的情况下无法做到的。

方案三:将专业对象作为成员属性存在

在进入大学的时候,每个人都需要先选择一个专业作为自己学习的方向,因此,我们可以将专业的信息作为学生的一个属性

  1. package com.dodoke.school.model;
  2. public class Student {
  3. //成员属性:学号,姓名,性别,年龄 专业
  4. private String studentNo;
  5. private String studentName;
  6. private String studentSex;
  7. private int studentAge;
  8. //在进行程序设计的时候,如果使用引用数据类型作为属性,需要考虑该属性是否会被经常引用
  9. //如果使用频率高,需要考虑是否存在空指针的风险!!!
  10. //使用对象作为属性和使用基本数据类型作为属性没有区别-都是数据类型 + 属性名
  11. //注意:此时的sub对象没有被实例化,依旧是默认值null
  12. private Subject sub;
  13. public String getStudentNo() {
  14. return studentNo;
  15. }
  16. public void setStudentNo(String studentNo) {
  17. this.studentNo = studentNo;
  18. }
  19. public String getStudentName() {
  20. return studentName;
  21. }
  22. public void setStudentName(String studentName) {
  23. this.studentName = studentName;
  24. }
  25. public String getStudentSex() {
  26. return studentSex;
  27. }
  28. /**
  29. * 性别限制为男或女,反之,强制限制为男
  30. * @param studentSex
  31. */
  32. public void setStudentSex(String studentSex) {
  33. if(studentSex.equals("男") || studentSex.equals("女")) {
  34. this.studentSex = studentSex;
  35. } else {
  36. this.studentSex = "男";
  37. }
  38. }
  39. public int getStudentAge() {
  40. return studentAge;
  41. }
  42. /**
  43. * 给年龄赋值,限制范围在10-100之间,赋值设置为18岁
  44. * @param studentAge
  45. */
  46. public void setStudentAge(int studentAge) {
  47. if(studentAge > 10 && studentAge < 100) {
  48. this.studentAge = studentAge;
  49. } else {
  50. this.studentAge = 18;
  51. }
  52. }
  53. /**
  54. * 获取专业对象,如果没有实例化,先实例化再返回
  55. * @return
  56. */
  57. public Subject getSub() {
  58. //为安全起见,在返回时,判断sub是否已经被实例化了
  59. //为了防止在未对sub属性进行赋值的时候就去取sub属性
  60. if(this.sub == null) {
  61. this.sub = new Subject();
  62. //如果在获取sub属性时,sub为null,直接进行sub属性的实例化
  63. }
  64. return sub;
  65. }
  66. public void setSub(Subject sub) {
  67. //此处就是通过外部参数对sub属性进行实例化
  68. this.sub = sub;
  69. }
  70. //无参构造
  71. public Student() {
  72. super();
  73. }
  74. //多参构造
  75. public Student(String studentNo, String studentName, String studentSex, int studentAge) {
  76. super();
  77. this.setStudentNo(studentNo);
  78. this.setStudentName(studentName);
  79. this.setStudentSex(studentSex);
  80. this.setStudentAge(studentAge);
  81. }
  82. //重载构造器,实现对全部属性的赋值
  83. public Student(String studentNo, String studentName, String studentSex, int studentAge, Subject sub) {
  84. super();
  85. this.setStudentNo(studentNo);
  86. this.setStudentName(studentName);
  87. this.setStudentSex(studentSex);
  88. this.setStudentAge(studentAge);
  89. this.setSub(sub);
  90. }
  91. /**
  92. * 学生自我介绍
  93. * @return 用于返回描述学生信息字符串
  94. */
  95. public String introduction() {
  96. String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n";
  97. str += "学号:" + this.getStudentNo()+ "\n";
  98. str += "性别:" + this.getStudentSex()+ "\n";
  99. str += "年龄:" + this.getStudentAge() + "\n";
  100. str += "所报专业名称:" + this.sub.getSubjectName() + "\n";
  101. str += "学制年限:" + this.sub.getSubjectLife() + "\n";
  102. return str;
  103. }
  104. /**
  105. * 学生自我介绍 + 所学专业
  106. * @param subjectName 所学专业名称
  107. * @param subjectLife 学制年限
  108. * @return 用于返回描述学生信息和所学专业的字符串
  109. */
  110. public String introduction(String subjectName, int subjectLife) {
  111. String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n";
  112. str += "学号:" + this.getStudentNo()+ "\n";
  113. str += "性别:" + this.getStudentSex()+ "\n";
  114. str += "年龄:" + this.getStudentAge() + "\n";
  115. str += "所报专业名称:" + subjectName + "\n";
  116. str += "学制年限:" + subjectLife + "\n";
  117. return str;
  118. }
  119. /**
  120. * 学生自我介绍 + 所学专业
  121. * @param sub 专业对象
  122. * @return 用于返回描述学生信息和所学专业的字符串
  123. */
  124. public String introduction(Subject sub) {
  125. String str = "学生信息如下:\n姓名:" + this.getStudentName() + "\n";
  126. str += "学号:" + this.getStudentNo()+ "\n";
  127. str += "性别:" + this.getStudentSex()+ "\n";
  128. str += "年龄:" + this.getStudentAge() + "\n";
  129. str += "所报专业名称:" + sub.getSubjectName() + "\n";
  130. str += "学制年限:" + sub.getSubjectLife() + "\n";
  131. return str;
  132. }
  133. }

测试:

  1. public class SchoolTest {
  2. public static void main(String[] args) {
  3. Subject sub = new Subject("计算机科学与应用","J0001",4);
  4. System.out.println(sub.info());
  5. System.out.println("=============================");
  6. //Student stu0 = new Student("S01","张三","男", 18);
  7. //System.out.println(stu0.introduction());空指针异常
  8. Student stu0 = new Student("S01","张三","男", 18, sub);
  9. System.out.println(stu0.introduction());//空指针异常
  10. }
  11. }

各方案小结

3. 综合案例-学生信息管理 - 图4

新增功能

新增需求及分析

对于这个专业,如果想要统计该专业有多少个学生进行了报名学习?
3. 综合案例-学生信息管理 - 图5
对于这个需求,我们可以试着通过将报名的学生装入一个容器中,然后统计该容器中有多少个学生就可以了。
3. 综合案例-学生信息管理 - 图6
那么该使用什么样的容器呢?

添加数组作为属性完成学生信息存储

  1. package com.dodoke.school.model;
  2. /**
  3. * 专业类
  4. * @author LiXinRong
  5. *
  6. */
  7. public class Subject {
  8. //成员属性:学科名称、学科编号、学制年限、报名该专业的学习信息、报名该专业的学生个数
  9. private String subjectName;
  10. private String subjectNo;
  11. private int subjectLife;
  12. private Student[] students;//此时该数组为初始化,默认值为null
  13. //因为数组的长度200,并不一定是实际保存的学生个数,所以设置一个属性来统计学生个数
  14. private int studentNum;
  15. public String getSubjectName() {
  16. return subjectName;
  17. }
  18. public void setSubjectName(String subjectName) {
  19. this.subjectName = subjectName;
  20. }
  21. public String getSubjectNo() {
  22. return subjectNo;
  23. }
  24. public void setSubjectNo(String subjectNo) {
  25. this.subjectNo = subjectNo;
  26. }
  27. public int getSubjectLife() {
  28. return subjectLife;
  29. }
  30. public void setSubjectLife(int subjectLife) {
  31. if(subjectLife < 0) {
  32. return;//直接使用return退出该setSubjectLife方法,使学制年限保存默认值为0
  33. }
  34. this.subjectLife = subjectLife;
  35. }
  36. /**
  37. * 获取选修专业的学生信息,如果保存的学生信息的数组未初始化,则,先初始化长度200
  38. * @return 保存学生信息的数组
  39. */
  40. public Student[] getStudents() {
  41. if(this.students == null) {
  42. //对于数组动态初始化,没有办法准确的定下数组长度,只能根据具体情况具体分析
  43. this.students = new Student[200];
  44. }
  45. return students;
  46. }
  47. public void setStudents(Student[] students) {
  48. this.students = students;
  49. }
  50. public int getStudentNum() {
  51. return studentNum;
  52. }
  53. public void setStudentNum(int studentNum) {
  54. if(studentNum < 0) {
  55. this.studentNum = 0;
  56. return;//这里使用同样使用return终结方法的运行
  57. }
  58. this.studentNum = studentNum;
  59. }
  60. public Subject() {
  61. }
  62. //带参构造
  63. public Subject(String subjectName, String subjectNo, int subjectLife) {
  64. super();
  65. this.setSubjectLife(subjectLife);
  66. this.setSubjectName(subjectName);
  67. this.setSubjectNo(subjectNo);
  68. }
  69. public Subject(String subjectName, String subjectNo, int subjectLife, Student[] stus) {
  70. super();
  71. this.setSubjectLife(subjectLife);
  72. this.setSubjectName(subjectName);
  73. this.setSubjectNo(subjectNo);
  74. this.setStudents(stus);
  75. }
  76. /**
  77. * 该方法用于描述专业信息
  78. * @return
  79. */
  80. public String info() {
  81. //字符串的拼接,尽量不要写的太长,会让人看得难受
  82. String str = "专业信息如下:\n专业名称:" + this.getSubjectName() + "\n";
  83. str += "专业编号:" + this.getSubjectNo() + "\n";
  84. str += "学制年限:" + this.getSubjectLife() + "年";
  85. return str;
  86. }
  87. /**
  88. * 将学生信息保存到数组中,将学生个数保存到个数统计中
  89. * @param stu 学生信息
  90. */
  91. public void addStudent(Student stu) {
  92. /* 如何添加学生信息到数组中去
  93. * 需要将学生数组进行遍历,依次判读数组中保存的元素是否为null
  94. * 如果为null就可以用学生信息(学生对象)替代
  95. */
  96. int i;
  97. for(i = 0; i < this.getStudents().length; i++) {
  98. if(this.getStudents()[i] == null) {
  99. this.getStudents()[i] = stu;
  100. break;
  101. }
  102. }
  103. //将个数保存到个数统计中去
  104. this.setStudentNum(i + 1);
  105. //对于该方法中的两步操作,还可以怎么写?
  106. }
  107. }

测试:

  1. public class SchoolTest {
  2. public static void main(String[] args) {
  3. Subject sub = new Subject("计算机科学与应用","J0001",4);
  4. System.out.println(sub.info());
  5. System.out.println("=============================");
  6. Student stu0 = new Student("S01","张三","男", 18, sub);
  7. System.out.println(stu0.introduction());
  8. System.out.println("=============================");
  9. Student stu1 = new Student("S02","李四","女", 19);
  10. System.out.println(stu1.introduction("计算机科学与应用", 4));
  11. System.out.println("=============================");
  12. Student stu2 = new Student("S03","王五","男", 18);
  13. System.out.println(stu2.introduction(sub));
  14. System.out.println("=============================");
  15. sub.addStudent(stu0);
  16. sub.addStudent(stu1);
  17. sub.addStudent(stu2);
  18. System.out.println(sub.getSubjectName() + "的专业中,已有" + sub.getStudentNum() + "个学生进行了报名");
  19. }
  20. }

问题分析

数组未实例化造成的空指针异常

实际上,在这样的一个小案例中,我们通常会发现学生会出现一些问题。

  1. public Student[] getStudents() {
  2. /*if(this.students == null) {
  3. //对于数组动态初始化,没有办法准确的定下数组长度,只能根据具体情况具体分析
  4. this.students = new Student[200];
  5. }*/
  6. return students;
  7. }

如果将上述代码注释掉之后,我们会发现,运行时出现了空指针的异常。这是因为,我们没有针对数组进行初始化。解决方法有两种:

  1. 给数组属性直接初始化
  2. 在使用数组属性时初始化

    通过一个方法完成学生和专业的双向关联

    之前的代码中,我们先通过实例化学生完成了学生与专业之间的关联,而后又通过添加学生方法实现了,专业与学生之间的关联。是否能有一个办法,完成学生与专业的双向关联。
    3. 综合案例-学生信息管理 - 图7

    1. /**
    2. * 将学生信息保存到数组中,将学生个数保存到个数统计中
    3. * @param stu 学生信息
    4. */
    5. public void addStudent(Student stu) {
    6. /* 如何添加学生信息到数组中去
    7. * 需要将学生数组进行遍历,依次判读数组中保存的元素是否为null
    8. * 如果为null就可以用学生信息(学生对象)替代
    9. */
    10. int i;
    11. for(i = 0; i < this.getStudents().length; i++) {
    12. if(this.getStudents()[i] == null) {
    13. stu.setSub(this);
    14. this.getStudents()[i] = stu;
    15. break;
    16. }
    17. }
    18. //将个数保存到个数统计中去
    19. this.setStudentNum(i + 1);
    20. //对于该方法中的两步操作,还可以怎么写?
    21. }

    测试:

    1. public class SchoolTest {
    2. public static void main(String[] args) {
    3. Subject sub = new Subject("计算机科学与应用","J0001",4);
    4. Student stu0 = new Student("S01","张三","男", 18);
    5. sub.addStudent(stu0);
    6. System.out.println(sub.getSubjectName() + "的专业中,已有" + sub.getStudentNum() + "个学生进行了报名");
    7. }
    8. }

    练习

    一、选择

  3. 执行下面代码后,哪几个结论是正确的
    3. 综合案例-学生信息管理 - 图8

    1. A. f[0]
    2. B. f[0] = 0.0
    3. C. 编译失败
    4. D. 在运行时抛出异常
  4. 执行下面代码后,哪几个结论是正确的(多选)

    1. String[ ] s = new String[10];
    1. A. s[9]为null
    2. B. s[10]的内容为空字符串
    3. C. 没有s[0]
    4. D. s.length=10

    二、编程题
    题目要求:
    某公司要开发内部的 “办公信息化管理系统”,请使用面向对象的思想描述以下员工信息。
    3. 综合案例-学生信息管理 - 图9
    3. 综合案例-学生信息管理 - 图10
    3. 综合案例-学生信息管理 - 图11
    程序运行参考效果图如下:
    3. 综合案例-学生信息管理 - 图12
    任务描述
    一、语言和环境

  • 实现语言
    Java语言
  • 环境要求及开发工具
    JDK、Eclipse

二、程序整体要求

  1. 划分功能模块,根据题目要求设置不同的类,在类中实现相应功能的管理。
  2. 类的标识要清楚易懂,代码结构要层次分明,代码编辑思路要清晰、整洁。
  3. 要求Java代码书写、命名符合规范,属性所属数据类型要准确合理,在代码中添加必要的注释
  4. 程序运行效果与提供的页面效果图、结构保持一致,信息间分隔符“=”号数量不做统一要求,文字大小、颜色也不做统一要求
  5. 作业完成后发表在自己的博客上

三、思路分析:
由场景和运行效果,可以分析出项目中可以抽取如下类(要求编码时注意面向对象思想及封装特性的应用):

  • 部门类:
    类型描述:能够描述部门编号、部门名称、员工数组、统计部门中的员工个数
    要求:设定方法统计该部门员工个数
    提示:部门类的属性有四个,分别是部门编号,部门名称,员工数组 和 统计变量 ,具体是市场部还是人事部,是通过部门类的对象来表示的,如果是市场部的对象,那么添加并统计的就是市场部的人数,同样如果是人事部的对象,添加并统计的就是人事部的人数
  • 职务类:
    类型描述:能够描述职务编号、职务名称
  • 员工类:类型描述:能够描述员工姓名、工号、年龄、性别、所属部门、职务信息要求:
    • 设定方法限定年龄只能是18—65之间,反之则设置默认为18岁
    • 设定方法限定性别只能是“男”或者“女”,反之则设置默认为”男”
    • 设定方法,实现员工自我介绍信息,将员工信息作为字符串返回
  • 测试类:
    类型描述:测试程序,并参照效果图输出结果

PS:注意:可以在属性上添加适当的信息验证,提高信息的安全性