1.案例驱动模式

1.1案例驱动模式概述 (理解)

通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题

1.2案例驱动模式的好处 (理解)

  • 解决重复代码过多的冗余,提高代码的复用性
  • 解决业务逻辑聚集紧密导致的可读性差,提高代码的可读性
  • 解决代码可维护性差,提高代码的维护性

2.分类思想

2.1分类思想概述 (理解)

分工协作,专人干专事

2.2黑马信息管理系统 (理解)

  • Student类 标准学生类,封装键盘录入的学生信息(id , name , age , birthday)
  • StudentDao类 Dao : (Data Access Object 缩写) 用于访问存储数据的数组或集合
  • StudentService类 用来进行业务逻辑的处理(例如: 判断录入的id是否存在)
  • StudentController类 和用户打交道(接收用户需求,采集用户信息,打印数据到控制台)
    image.png

3.分包思想

3.1分包思想概述 (理解)

如果将所有的类文件都放在同一个包下,不利于管理和后期维护,所以,对于不同功能的类文件,可以放在不同的包下进行管理

3.2包的概述 (记忆)


  • 本质上就是文件夹
  • 创建包
    多级包之间使用 “ . “ 进行分割
    多级包的定义规范:公司的网站地址翻转(去掉www)
    比如:黑马程序员的网站址为www.itheima.com
    后期我们所定义的包的结构就是:com.itheima.其他的包名
  • 包的命名规则
    字母都是小写

3.3包的注意事项 (理解)

  • package语句必须是程序的第一条可执行的代码
  • package语句在一个java文件中只能有一个
  • 如果没有package,默认表示无包名

3.4类与类之间的访问 (理解)

  • 同一个包下的访问
    不需要导包,直接使用即可
  • 不同包下的访问
    1.import 导包后访问
    2.通过全类名(包名 + 类名)访问
  • 注意:import 、package 、class 三个关键字的摆放位置存在顺序关系
    package 必须是程序的第一条可执行的代码
    import 需要写在 package 下面
    class 需要在 import 下面

4.黑马信息管理系统

4.1系统介绍 (理解)

image.png

4.2学生管理系统 (应用)

4.2.1需求说明

  • 添加学生: 键盘录入学生信息(id,name,age,birthday)
    使用数组存储学生信息,要求学生的id不能重复
  • 删除学生: 键盘录入要删除学生的id值,将该学生从数组中移除,如果录入的id在数组中不存在,需要重新录入
  • 修改学生: 键盘录入要修改学生的id值和修改后的学生信息
    将数组中该学生的信息修改,如果录入的id在数组中不存在,需要重新录入
  • 查询学生: 将数组中存储的所有学生的信息输出到控制台

4.2.2实现步骤

  • 环境搭建实现步骤
    | 包 | 存储的类 | 作用 | | —- | —- | —- | | com.itheima.edu.info.manager.domain | Student.java | 封装学生信息 | | com.itheima.edu.info.manager.dao | StudentDao.java | 访问存储数据的数组,进行赠删改查(库管) | | com.itheima.edu.info.manager.service | StudentService.java | 业务的逻辑处理(业务员) | | com.itheima.edu.info.manager.controller | StudentController.java | 和用户打交道(客服接待) | | com.itheima.edu.info.manager.entry | InfoManagerEntry.java | 程序的入口类,提供一个main方法 |

  • 菜单搭建实现步骤

    • 需求
      • 黑马管理系统菜单搭建
      • 学生管理系统菜单搭建
    • 实现步骤
      1. 展示欢迎页面,用输出语句完成主界面的编写
      2. 获取用户的选择,用Scanner实现键盘录入数据
      3. 根据用户的选择执行对应的操作,用switch语句完成操作的选择
  • 添加功能实现步骤
    image.png
  • 添加功能优化:判断id是否存在
    image.png
  • 查询功能实现步骤
    image.png
  • 删除功能实现步骤
    image.png
  • 修改功能实现步骤
    image.png
  • 系统优化
    • 把updateStudent和deleteStudentById中录入学生id代码抽取到一个方法(inputStudentId)中
      该方法的主要作用就是录入学生的id,方法的返回值为String类型
    • 把addStudent和updateStudent中录入学生信息的代码抽取到一个方法(inputStudentInfo)中
      该方法的主要作用就是录入学生的信息,并封装为学生对象,方法的返回值为Student类型

4.2.3代码实现

学生类

  1. public class Student {
  2. private String id;
  3. private String name;
  4. private String age;
  5. private String birthday;
  6. String address;
  7. public Student() {
  8. }
  9. public Student(String id, String name, String age, String birthday) {
  10. this.id = id;
  11. this.name = name;
  12. this.age = age;
  13. this.birthday = birthday;
  14. }
  15. public String getId() {
  16. return id;
  17. }
  18. public void setId(String id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public String getAge() {
  28. return age;
  29. }
  30. public void setAge(String age) {
  31. this.age = age;
  32. }
  33. public String getBirthday() {
  34. return birthday;
  35. }
  36. public void setBirthday(String birthday) {
  37. this.birthday = birthday;
  38. }
  39. }

程序入口InfoManagerEntry类

  1. public class InfoManagerEntry {
  2. public static void main(String[] args) {
  3. Scanner sc = new Scanner(System.in);
  4. while (true) {
  5. // 主菜单搭建
  6. System.out.println("--------欢迎来到黑马信息管理系统--------");
  7. System.out.println("请输入您的选择: 1.学生管理 2.老师管理 3.退出");
  8. String choice = sc.next();
  9. switch (choice) {
  10. case "1":
  11. // System.out.println("学生管理");
  12. // 开启学生管理系统
  13. StudentController studentController = new StudentController();
  14. studentController.start();
  15. break;
  16. case "2":
  17. System.out.println("老师管理");
  18. TeacherController teacherController = new TeacherController();
  19. teacherController.start();
  20. break;
  21. case "3":
  22. System.out.println("感谢您的使用");
  23. // 退出当前正在运行的JVM虚拟机
  24. System.exit(0);
  25. break;
  26. default:
  27. System.out.println("您的输入有误, 请重新输入");
  28. break;
  29. }
  30. }
  31. }
  32. }

StudentController类

  1. public class StudentController {
  2. // 业务员对象
  3. private StudentService studentService = new StudentService();
  4. private Scanner sc = new Scanner(System.in);
  5. // 开启学生管理系统, 并展示学生管理系统菜单
  6. public void start() {
  7. //Scanner sc = new Scanner(System.in);
  8. studentLoop:
  9. while (true) {
  10. System.out.println("--------欢迎来到 <学生> 管理系统--------");
  11. System.out.println("请输入您的选择: 1.添加学生 2.删除学生 3.修改学生 4.查看学生 5.退出");
  12. String choice = sc.next();
  13. switch (choice) {
  14. case "1":
  15. // System.out.println("添加");
  16. addStudent();
  17. break;
  18. case "2":
  19. // System.out.println("删除");
  20. deleteStudentById();
  21. break;
  22. case "3":
  23. // System.out.println("修改");
  24. updateStudent();
  25. break;
  26. case "4":
  27. // System.out.println("查询");
  28. findAllStudent();
  29. break;
  30. case "5":
  31. System.out.println("感谢您使用学生管理系统, 再见!");
  32. break studentLoop;
  33. default:
  34. System.out.println("您的输入有误, 请重新输入");
  35. break;
  36. }
  37. }
  38. }
  39. // 修改学生方法
  40. public void updateStudent() {
  41. String updateId = inputStudentId();
  42. Student newStu = inputStudentInfo(updateId);
  43. studentService.updateStudent(updateId, newStu);
  44. System.out.println("修改成功!");
  45. }
  46. // 删除学生方法
  47. public void deleteStudentById() {
  48. String delId = inputStudentId();
  49. // 3. 调用业务员中的deleteStudentById根据id, 删除学生
  50. studentService.deleteStudentById(delId);
  51. // 4. 提示删除成功
  52. System.out.println("删除成功!");
  53. }
  54. // 查看学生方法
  55. public void findAllStudent() {
  56. // 1. 调用业务员中的获取方法, 得到学生的对象数组
  57. Student[] stus = studentService.findAllStudent();
  58. // 2. 判断数组的内存地址, 是否为null
  59. if (stus == null) {
  60. System.out.println("查无信息, 请添加后重试");
  61. return;
  62. }
  63. // 3. 遍历数组, 获取学生信息并打印在控制台
  64. System.out.println("学号\t\t姓名\t年龄\t生日");
  65. for (int i = 0; i < stus.length; i++) {
  66. Student stu = stus[i];
  67. if (stu != null) {
  68. System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t\t" + stu.getBirthday());
  69. }
  70. }
  71. }
  72. // 添加学生方法
  73. public void addStudent() {
  74. // StudentService studentService = new StudentService();
  75. // 1. 键盘接收学生信息
  76. String id;
  77. while (true) {
  78. System.out.println("请输入学生id:");
  79. id = sc.next();
  80. boolean flag = studentService.isExists(id);
  81. if (flag) {
  82. System.out.println("学号已被占用, 请重新输入");
  83. } else {
  84. break;
  85. }
  86. }
  87. Student stu = inputStudentInfo(id);
  88. // 3. 将学生对象,传递给StudentService(业务员)中的addStudent方法
  89. boolean result = studentService.addStudent(stu);
  90. // 4. 根据返回的boolean类型结果, 在控制台打印成功\失败
  91. if (result) {
  92. System.out.println("添加成功");
  93. } else {
  94. System.out.println("添加失败");
  95. }
  96. }
  97. // 键盘录入学生id
  98. public String inputStudentId() {
  99. String id;
  100. while (true) {
  101. System.out.println("请输入学生id:");
  102. id = sc.next();
  103. boolean exists = studentService.isExists(id);
  104. if (!exists) {
  105. System.out.println("您输入的id不存在, 请重新输入:");
  106. } else {
  107. break;
  108. }
  109. }
  110. return id;
  111. }
  112. // 键盘录入学生信息
  113. public Student inputStudentInfo(String id) {
  114. System.out.println("请输入学生姓名:");
  115. String name = sc.next();
  116. System.out.println("请输入学生年龄:");
  117. String age = sc.next();
  118. System.out.println("请输入学生生日:");
  119. String birthday = sc.next();
  120. Student stu = new Student();
  121. stu.setId(id);
  122. stu.setName(name);
  123. stu.setAge(age);
  124. stu.setBirthday(birthday);
  125. return stu;
  126. }
  127. }

StudentService类

  1. public class StudentService {
  2. // 创建StudentDao (库管)
  3. private StudentDao studentDao = new StudentDao();
  4. // 添加学生方法
  5. public boolean addStudent(Student stu) {
  6. // 2. 将学生对象, 传递给StudentDao 库管中的addStudent方法
  7. // 3. 将返回的boolean类型结果, 返还给StudentController
  8. return studentDao.addStudent(stu);
  9. }
  10. // 判断学号是否存在方法
  11. public boolean isExists(String id) {
  12. Student[] stus = studentDao.findAllStudent();
  13. // 假设id在数组中不存在
  14. boolean exists = false;
  15. // 遍历数组, 获取每一个学生对象, 准备进行判断
  16. for (int i = 0; i < stus.length; i++) {
  17. Student student = stus[i];
  18. if(student != null && student.getId().equals(id)){
  19. exists = true;
  20. break;
  21. }
  22. }
  23. return exists;
  24. }
  25. // 查看学生方法
  26. public Student[] findAllStudent() {
  27. // 1. 调用库管对象的findAllStudent获取学生对象数组
  28. Student[] allStudent = studentDao.findAllStudent();
  29. // 2. 判断数组中是否有学生信息 (有: 返回地址, 没有: 返回null)
  30. // 思路: 数组中只要存在一个不是null的元素, 那就代表有学生信息
  31. boolean flag = false;
  32. for (int i = 0; i < allStudent.length; i++) {
  33. Student stu = allStudent[i];
  34. if(stu != null){
  35. flag = true;
  36. break;
  37. }
  38. }
  39. if(flag){
  40. // 有信息
  41. return allStudent;
  42. }else{
  43. // 没有信息
  44. return null;
  45. }
  46. }
  47. public void deleteStudentById(String delId) {
  48. studentDao.deleteStudentById(delId);
  49. }
  50. public void updateStudent(String updateId, Student newStu) {
  51. studentDao.updateStudent(updateId, newStu);
  52. }
  53. }

StudentDao类

  1. public class StudentDao {
  2. // 创建学生对象数组
  3. private static Student[] stus = new Student[5];
  4. // 添加学生方法
  5. public boolean addStudent(Student stu) {
  6. // 2. 添加学生到数组
  7. //2.1 定义变量index为-1,假设数组已经全部存满,没有null的元素
  8. int index = -1;
  9. //2.2 遍历数组取出每一个元素,判断是否是null
  10. for (int i = 0; i < stus.length; i++) {
  11. Student student = stus[i];
  12. if(student == null){
  13. index = i;
  14. //2.3 如果为null,让index变量记录当前索引位置,并使用break结束循环遍历
  15. break;
  16. }
  17. }
  18. // 3. 返回是否添加成功的boolean类型状态
  19. if(index == -1){
  20. // 装满了
  21. return false;
  22. }else{
  23. // 没有装满, 正常添加, 返回true
  24. stus[index] = stu;
  25. return true;
  26. }
  27. }
  28. // 查看学生方法
  29. public Student[] findAllStudent() {
  30. return stus;
  31. }
  32. public void deleteStudentById(String delId) {
  33. // 1. 查找id在容器中所在的索引位置
  34. int index = getIndex(delId);
  35. // 2. 将该索引位置,使用null元素进行覆盖
  36. stus[index] = null;
  37. }
  38. public int getIndex(String id){
  39. int index = -1;
  40. for (int i = 0; i < stus.length; i++) {
  41. Student stu = stus[i];
  42. if(stu != null && stu.getId().equals(id)){
  43. index = i;
  44. break;
  45. }
  46. }
  47. return index;
  48. }
  49. public void updateStudent(String updateId, Student newStu) {
  50. // 1. 查找updateId, 在容器中的索引位置
  51. int index = getIndex(updateId);
  52. // 2. 将该索引位置, 使用新的学生对象替换
  53. stus[index] = newStu;
  54. }
  55. }

4.3老师管理系统 (应用)

4.3.1需求说明

  • 添加老师: 通过键盘录入老师信息(id,name,age,birthday)
    使用数组存储老师信息,要求老师的id不能重复
  • 删除老师: 通过键盘录入要删除老师的id值,将该老师从数组中移除,如果录入的id在数组中不存在,需要重新录入
  • 修改老师: 通过键盘录入要修改老师的id值和修改后的老师信息
    将数组中该老师的信息修改,如果录入的id在数组中不存在,需要重新录入
  • 查询老师: 将数组中存储的所有老师的信息输出到控制台

4.3.2实现步骤

  • 环境搭建实现步骤
    | 包 | 存储的类 | 作用 | | —- | —- | —- | | com.itheima.edu.info.manager.domain | Student.java Teacher.java | 封装学生信息 封装老师信息 | | com.itheima.edu.info.manager.dao | StudentDao.java TeacherDao.java | 访问存储数据的数组,进行赠删改查(库管) | | com.itheima.edu.info.manager.service | StudentService.java TeacherService.java | 业务的逻辑处理(业务员) | | com.itheima.edu.info.manager.controller | StudentController.java TeacherController.java | 和用户打交道(客服接待) | | com.itheima.edu.info.manager.entry | InfoManagerEntry.java | 程序的入口类,提供一个main方法 |

  • 菜单搭建实现步骤

    1. 展示欢迎页面,用输出语句完成主界面的编写
    2. 获取用户的选择,用Scanner实现键盘录入数据
    3. 根据用户的选择执行对应的操作,用switch语句完成操作的选择
  • 添加功能实现步骤
    image.png
  • 查询功能实现步骤
    image.png
  • 删除功能实现步骤
    image.png
  • 修改功能实现步骤
    image.png
  • 系统优化
    • 把updateTeacher和deleteTeacherById中录入老师id代码抽取到一个方法(inputTeacherId)中
      该方法的主要作用就是录入老师的id,方法的返回值为String类型
    • 把addTeacher和updateTeacher中录入老师信息的代码抽取到一个方法(inputTeacherInfo)中
      该方法的主要作用就是录入老师的信息,并封装为老师对象,方法的返回值为Teacher类型

4.3.3代码实现

老师类

  1. public class Teacher extends Person{
  2. private String id;
  3. private String name;
  4. private String age;
  5. private String birthday;
  6. String address;
  7. public Teacher() {
  8. }
  9. public Teacher(String id, String name, String age, String birthday) {
  10. this.id = id;
  11. this.name = name;
  12. this.age = age;
  13. this.birthday = birthday;
  14. }
  15. public String getId() {
  16. return id;
  17. }
  18. public void setId(String id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public String getAge() {
  28. return age;
  29. }
  30. public void setAge(String age) {
  31. this.age = age;
  32. }
  33. public String getBirthday() {
  34. return birthday;
  35. }
  36. public void setBirthday(String birthday) {
  37. this.birthday = birthday;
  38. }
  39. }

TeacherController类

  1. public class TeacherController {
  2. private Scanner sc = new Scanner(System.in);
  3. private TeacherService teacherService = new TeacherService();
  4. public void start() {
  5. teacherLoop:
  6. while (true) {
  7. System.out.println("--------欢迎来到 <老师> 管理系统--------");
  8. System.out.println("请输入您的选择: 1.添加老师 2.删除老师 3.修改老师 4.查看老师 5.退出");
  9. String choice = sc.next();
  10. switch (choice) {
  11. case "1":
  12. // System.out.println("添加老师");
  13. addTeacher();
  14. break;
  15. case "2":
  16. // System.out.println("删除老师");
  17. deleteTeacherById();
  18. break;
  19. case "3":
  20. // System.out.println("修改老师");
  21. updateTeacher();
  22. break;
  23. case "4":
  24. // System.out.println("查看老师");
  25. findAllTeacher();
  26. break;
  27. case "5":
  28. System.out.println("感谢您使用老师管理系统, 再见!");
  29. break teacherLoop;
  30. default:
  31. System.out.println("您的输入有误, 请重新输入");
  32. break;
  33. }
  34. }
  35. }
  36. public void updateTeacher() {
  37. String id = inputTeacherId();
  38. Teacher newTeacher = inputTeacherInfo(id);
  39. // 调用业务员的修改方法
  40. teacherService.updateTeacher(id,newTeacher);
  41. System.out.println("修改成功");
  42. }
  43. public void deleteTeacherById() {
  44. String id = inputTeacherId();
  45. // 2. 调用业务员中的删除方法, 根据id, 删除老师
  46. teacherService.deleteTeacherById(id);
  47. // 3. 提示删除成功
  48. System.out.println("删除成功");
  49. }
  50. public void findAllTeacher() {
  51. // 1. 从业务员中, 获取老师对象数组
  52. Teacher[] teachers = teacherService.findAllTeacher();
  53. // 2. 判断数组中是否有元素
  54. if (teachers == null) {
  55. System.out.println("查无信息, 请添加后重试");
  56. return;
  57. }
  58. // 3. 遍历数组, 取出元素, 并打印在控制台
  59. System.out.println("学号\t\t姓名\t年龄\t生日");
  60. for (int i = 0; i < teachers.length; i++) {
  61. Teacher t = teachers[i];
  62. if (t != null) {
  63. System.out.println(t.getId() + "\t" + t.getName() + "\t" + t.getAge() + "\t\t" + t.getBirthday());
  64. }
  65. }
  66. }
  67. public void addTeacher() {
  68. String id;
  69. while (true) {
  70. // 1. 接收不存在的老师id
  71. System.out.println("请输入老师id:");
  72. id = sc.next();
  73. // 2. 判断id是否存在
  74. boolean exists = teacherService.isExists(id);
  75. if (exists) {
  76. System.out.println("id已被占用, 请重新输入:");
  77. } else {
  78. break;
  79. }
  80. }
  81. Teacher t = inputTeacherInfo(id);
  82. // 5. 将封装好的老师对象, 传递给TeacherService继续完成添加操作
  83. boolean result = teacherService.addTeacher(t);
  84. if (result) {
  85. System.out.println("添加成功");
  86. } else {
  87. System.out.println("添加失败");
  88. }
  89. }
  90. // 录入老师id
  91. public String inputTeacherId(){
  92. String id;
  93. while(true){
  94. System.out.println("请输入id");
  95. id = sc.next();
  96. boolean exists = teacherService.isExists(id);
  97. if(!exists){
  98. System.out.println("您输入的id不存在, 请重新输入:");
  99. }else{
  100. break;
  101. }
  102. }
  103. return id;
  104. }
  105. // 录入老师信息, 封装为老师对象
  106. public Teacher inputTeacherInfo(String id){
  107. System.out.println("请输入老师姓名:");
  108. String name = sc.next();
  109. System.out.println("请输入老师年龄:");
  110. String age = sc.next();
  111. System.out.println("请输入老师生日:");
  112. String birthday = sc.next();
  113. Teacher t = new Teacher();
  114. t.setId(id);
  115. t.setName(name);
  116. t.setAge(age);
  117. t.setBirthday(birthday);
  118. return t;
  119. }
  120. }

TeacherService类

  1. public class TeacherService {
  2. private TeacherDao teacherDao = new TeacherDao();
  3. public boolean addTeacher(Teacher t) {
  4. return teacherDao.addTeacher(t);
  5. }
  6. public boolean isExists(String id) {
  7. // 1. 获取库管对象中的数组
  8. Teacher[] teachers = teacherDao.findAllTeacher();
  9. boolean exists = false;
  10. // 2. 遍历数组, 取出每一个元素, 进行判断
  11. for (int i = 0; i < teachers.length; i++) {
  12. Teacher teacher = teachers[i];
  13. if(teacher != null && teacher.getId().equals(id)){
  14. exists = true;
  15. break;
  16. }
  17. }
  18. return exists;
  19. }
  20. public Teacher[] findAllTeacher() {
  21. Teacher[] allTeacher = teacherDao.findAllTeacher();
  22. boolean flag = false;
  23. for (int i = 0; i < allTeacher.length; i++) {
  24. Teacher t = allTeacher[i];
  25. if(t != null){
  26. flag = true;
  27. break;
  28. }
  29. }
  30. if(flag){
  31. return allTeacher;
  32. }else{
  33. return null;
  34. }
  35. }
  36. public void deleteTeacherById(String id) {
  37. teacherDao.deleteTeacherById(id);
  38. }
  39. public void updateTeacher(String id, Teacher newTeacher) {
  40. teacherDao.updateTeacher(id,newTeacher);
  41. }
  42. }

TeacherDao类

  1. public class TeacherDao {
  2. private static Teacher[] teachers = new Teacher[5];
  3. public boolean addTeacher(Teacher t) {
  4. int index = -1;
  5. for (int i = 0; i < teachers.length; i++) {
  6. Teacher teacher = teachers[i];
  7. if(teacher == null){
  8. index = i;
  9. break;
  10. }
  11. }
  12. if(index == -1){
  13. return false;
  14. }else{
  15. teachers[index] = t;
  16. return true;
  17. }
  18. }
  19. public Teacher[] findAllTeacher() {
  20. return teachers;
  21. }
  22. public void deleteTeacherById(String id) {
  23. // 1. 查询id在数组中的索引位置
  24. int index = getIndex(id);
  25. // 2. 将该索引位置的元素, 使用null进行替换
  26. teachers[index] = null;
  27. }
  28. public int getIndex(String id){
  29. int index = -1;
  30. for (int i = 0; i < teachers.length; i++) {
  31. Teacher t = teachers[i];
  32. if(t != null && t.getId().equals(id)){
  33. index = i;
  34. break;
  35. }
  36. }
  37. return index;
  38. }
  39. public void updateTeacher(String id, Teacher newTeacher) {
  40. int index = getIndex(id);
  41. teachers[index] = newTeacher;
  42. }
  43. }

5.static关键字

5.1static关键字概述 (理解)

static 关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量

5.2static修饰的特点 (记忆)

  • 被类的所有对象共享
    是我们判断是否使用静态关键字的条件
  • 随着类的加载而加载,优先于对象存在
    对象需要类被加载后,才能创建
  • 可以通过类名调用
    也可以通过对象名调用

5.3static关键字注意事项 (理解)

  • 静态方法只能访问静态的成员
  • 非静态方法可以访问静态的成员,也可以访问非静态的成员
  • 静态方法中是没有this关键字