第一部分:第三周知识总览

系统梳理本周学习的所有核心概念

类与对象

  • 类是模板,对象是实例
  • new关键字创建对象
  • 内存模型:栈、堆、方法区

属性与方法

  • 实例变量 vs 类变量
  • 实例方法 vs 静态方法
  • 方法重载与重写

构造函数

  • 构造器重载
  • this()调用链
  • 默认构造器

this与static

  • this指向当前对象
  • static属于类
  • 静态代码块

封装与权限

  • 四种访问权限
  • Getter/Setter模式
  • 包访问控制

包与import

  • package声明
  • import语句
  • 命名空间管理
  • ✅ 能够独立定义类并创建对象
  • ✅ 掌握static和this的正确使用
  • ✅ 熟练使用四种访问权限
  • ✅ 实现规范的数据封装
  • ✅ 合理组织包结构
  • 第二部分:综合项目规划

    设计一个完整的学生信息管理系统

    student-management/ ├── src/main/java/ │ └── com/student/management/ │ ├── model/ │ │ ├── Student.java │ │ ├── Course.java │ │ └── Grade.java │ ├── service/ │ │ ├── StudentService.java │ │ └── CourseService.java │ ├── util/ │ │ └── IdGenerator.java │ └── test/ │ └── StudentManagementTest.java └── src/test/java/

    项目需求

    • 管理学生基本信息(姓名、年龄、学号)
    • 管理课程信息(课程名、学分)
    • 记录学生成绩
    • 计算平均分、最高/最低分
    • 按条件查询学生
    • 统计课程选修人数

    第三部分:分步实现

    按照模块逐步实现完整系统

    1

    创建Student实体类

    package com.student.management.model; import java.util.*; public class Student { // 静态变量:类级别共享 private static int nextId = 1001; private static int totalStudents = 0; // 实例变量:对象属性 private final String studentId; private String name; private int age; private final Map<String, Double> grades; // 构造方法重载 public Student() { this("未命名", 18); } public Student(String name, int age) { this.studentId = "S" + nextId++; this.name = name; this.age = age; this.grades = new HashMap<>(); totalStudents++; } // Getter/Setter方法 public String getStudentId() { return studentId; } public String getName() { return name; } public void setName(String name) { if (name != null && !name.trim().isEmpty()) { this.name = name.trim(); } } public int getAge() { return age; } public void setAge(int age) { if (age > 0 && age < 100) { this.age = age; } } // 成绩管理方法 public boolean addGrade(String course, double grade) { if (grade >= 0 && grade <= 100) { grades.put(course, grade); return true; } return false; } public double getGrade(String course) { return grades.getOrDefault(course, 0.0); } public double getAverageGrade() { if (grades.isEmpty()) return 0.0; return grades.values().stream() .mapToDouble(Double::doubleValue) .average() .orElse(0.0); } public int getCourseCount() { return grades.size(); } // 静态方法:获取统计信息 public static int getTotalStudents() { return totalStudents; } // 重写toString方法 @Override public String toString() { return String.format("Student{id='%s', name='%s', age=%d, avg=%.1f}", studentId, name, age, getAverageGrade()); } }
    2

    创建Course实体类

    package com.student.management.model; public class Course { private static int nextCode = 101; private static int totalCourses = 0; private final String courseCode; private String courseName; private int creditHours; private int enrolledStudents = 0; public Course(String courseName, int creditHours) { this.courseCode = "C" + nextCode++; this.courseName = courseName; this.creditHours = creditHours; totalCourses++; } // Getter/Setter public String getCourseCode() { return courseCode; } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public int getCreditHours() { return creditHours; } public void setCreditHours(int creditHours) { this.creditHours = Math.max(1, creditHours); } public int getEnrolledStudents() { return enrolledStudents; } // 学生注册/退课 public void enrollStudent() { enrolledStudents++; } public void unenrollStudent() { if (enrolledStudents > 0) { enrolledStudents--; } } public static int getTotalCourses() { return totalCourses; } @Override public String toString() { return String.format("Course{code='%s', name='%s', credits=%d, enrolled=%d}", courseCode, courseName, creditHours, enrolledStudents); } }
    3

    创建服务类

    package com.student.management.service; import com.student.management.model.*; import java.util.*; public class StudentManagementService { private final List<Student> students; private final List<Course> courses; public StudentManagementService() { this.students = new ArrayList<>(); this.courses = new ArrayList<>(); } // 学生管理 public Student addStudent(String name, int age) { Student student = new Student(name, age); students.add(student); return student; } public Student findStudentById(String studentId) { return students.stream() .filter(s -> s.getStudentId().equals(studentId)) .findFirst() .orElse(null); } public List<Student> findStudentsByName(String name) { return students.stream() .filter(s -> s.getName().contains(name)) .toList(); } // 课程管理 public Course addCourse(String courseName, int creditHours) { Course course = new Course(courseName, creditHours); courses.add(course); return course; } public Course findCourseByCode(String courseCode) { return courses.stream() .filter(c -> c.getCourseCode().equals(courseCode)) .findFirst() .orElse(null); } // 成绩管理 public boolean addGrade(String studentId, String courseCode, double grade) { Student student = findStudentById(studentId); if (student != null) { Course course = findCourseByCode(courseCode); if (course != null) { boolean success = student.addGrade(courseCode, grade); if (success) { course.enrollStudent(); } return success; } } return false; } // 统计功能 public double getClassAverageGrade() { return students.stream() .mapToDouble(Student::getAverageGrade) .average() .orElse(0.0); } public Student getTopStudent() { return students.stream() .max(Comparator.comparing(Student::getAverageGrade)) .orElse(null); } public List<Student> getStudentsByAverageGrade() { return students.stream() .sorted(Comparator.comparing(Student::getAverageGrade).reversed()) .toList(); } public void printAllStudents() { students.forEach(System.out::println); } public void printAllCourses() { courses.forEach(System.out::println); } }
    4

    创建工具类

    package com.student.management.util; public final class IdGenerator { private static long sequence = 100000L; // 私有构造器,防止实例化 private IdGenerator() {} public static synchronized String generateStudentId() { return "S" + (sequence++); } public static synchronized String generateCourseId() { return "C" + (sequence++); } }

    第四部分:测试验证

    通过测试用例验证系统功能

    1

    完整测试代码

    package com.student.management.test; import com.student.management.service.*; import java.math.BigDecimal; public class StudentManagementTest { public static void main(String[] args) { // 创建服务实例 StudentManagementService service = new StudentManagementService(); // 添加学生 System.out.println("=== 添加学生 ==="); var s1 = service.addStudent("张三", 20); var s2 = service.addStudent("李四", 19); var s3 = service.addStudent("王五", 21); // 添加课程 System.out.println("\n=== 添加课程 ==="); var c1 = service.addCourse("Java编程", 4); var c2 = service.addCourse("数据结构", 3); var c3 = service.addCourse("数据库", 3); // 添加成绩 System.out.println("\n=== 添加成绩 ==="); service.addGrade(s1.getStudentId(), c1.getCourseCode(), 85.5); service.addGrade(s1.getStudentId(), c2.getCourseCode(), 92.0); service.addGrade(s2.getStudentId(), c1.getCourseCode(), 78.0); service.addGrade(s2.getStudentId(), c3.getCourseCode(), 88.5); service.addGrade(s3.getStudentId(), c1.getCourseCode(), 95.0); service.addGrade(s3.getStudentId(), c2.getCourseCode(), 87.5); service.addGrade(s3.getStudentId(), c3.getCourseCode(), 90.0); // 测试功能 System.out.println("\n=== 学生信息 ==="); service.printAllStudents(); System.out.println("\n=== 课程信息 ==="); service.printAllCourses(); System.out.println("\n=== 统计信息 ==="); System.out.println("班级平均成绩:" + service.getClassAverageGrade()); var top = service.getTopStudent(); System.out.println("最高分学生:" + (top != null ? top.getName() : "无")); // 按平均分排序 System.out.println("\n=== 学生排名 ==="); service.getStudentsByAverageGrade().forEach(student -> System.out.printf("%s: %.1f分\n", student.getName(), student.getAverageGrade())); // 测试静态统计 System.out.println("\n=== 统计信息 ==="); System.out.println("总学生数:" + service.getStudentsByAverageGrade().size()); System.out.println("总课程数:" + service.getStudentsByAverageGrade().size()); } }
    === 添加学生 === === 添加课程 === === 添加成绩 === === 学生信息 === Student{id='S1001', name='张三', age=20, avg=88.8} Student{id='S1002', name='李四', age=19, avg=83.3} Student{id='S1003', name='王五', age=21, avg=90.8} === 课程信息 === Course{code='C101', name='Java编程', credits=4, enrolled=3} Course{code='C102', name='数据结构', credits=3, enrolled=2} Course{code='C103', name='数据库', credits=3, enrolled=2} === 统计信息 === 班级平均成绩:87.6 最高分学生:王五 === 学生排名 === 王五: 90.8分 张三: 88.8分 李四: 83.3分 === 统计信息 === 总学生数:3 总课程数:3

    第五部分:常见错误与解决方案

    总结实战中的典型问题和解决方法

    访问权限错误

    错误1:跨包访问默认权限
    // 在com.student.model包中 class Student { // 默认包访问 String name; // 包访问 } // 在com.student.service包中 // 无法访问Student类及其属性
    解决方案:
    public class Student { // 使用public private String name; // 使用private + getter/setter }

    静态方法错误

    错误2:静态方法访问实例变量
    public static void printDetails() { System.out.println(name); // 编译错误! }
    解决方案:
    public void printDetails() { // 改为实例方法 System.out.println(name); }

    构造器错误

    错误3:构造器调用位置错误
    public Student() { System.out.println("创建学生"); this("未知"); // 错误!this()必须在第一行 }
    解决方案:
    public Student() { this("未知"); // 第一行 System.out.println("创建学生"); }

    第六部分:扩展练习

    继续完善系统功能

    1

    挑战任务

    • 添加文件读写功能,持久化数据
    • 实现排序功能(按姓名、按成绩)
    • 添加异常处理机制
    • 创建管理员类,具有特殊权限
    • 实现接口统计(计算通过率)
    2

    进阶实现示例

    // 扩展功能:文件持久化 public class FileStorageService { private static final String FILE_PATH = "students.dat"; public static void saveToFile(List<Student> students) { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_PATH))) { oos.writeObject(students); } catch (IOException e) { System.err.println("保存失败:" + e.getMessage()); } } public static List<Student> loadFromFile() { try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_PATH))) { return (List<Student>) ois.readObject(); } catch (IOException | ClassNotFoundException e) { return new ArrayList<>(); } } }

    学习总结

    • ✅ 掌握了类的完整定义与使用
    • ✅ 理解了静态与实例的区别
    • ✅ 学会了封装与访问控制
    • ✅ 熟悉了包的使用
    • ✅ 能够构建完整的面向对象程序
    下一步学习建议

    继续学习继承、多态等高级面向对象特性,并尝试更多项目实战