第一部分:第三周知识总览
系统梳理本周学习的所有核心概念
类与对象
- 类是模板,对象是实例
- new关键字创建对象
- 内存模型:栈、堆、方法区
属性与方法
- 实例变量 vs 类变量
- 实例方法 vs 静态方法
- 方法重载与重写
构造函数
- 构造器重载
- this()调用链
- 默认构造器
this与static
- this指向当前对象
- static属于类
- 静态代码块
封装与权限
- 四种访问权限
- Getter/Setter模式
- 包访问控制
包与import
- package声明
- import语句
- 命名空间管理
第二部分:综合项目规划
设计一个完整的学生信息管理系统
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<>();
}
}
}
学习总结
- ✅ 掌握了类的完整定义与使用
- ✅ 理解了静态与实例的区别
- ✅ 学会了封装与访问控制
- ✅ 熟悉了包的使用
- ✅ 能够构建完整的面向对象程序
下一步学习建议
继续学习继承、多态等高级面向对象特性,并尝试更多项目实战