杰瑞科技汇

Java程序设计项目教程适合零基础学吗?

Java程序设计项目教程:构建学生信息管理系统

第一部分:项目概述与准备

项目目标

我们将开发一个控制台(命令行)版的学生信息管理系统,该系统需要具备以下功能:

  • 添加学生信息:包括学号、姓名、年龄、性别。
  • 查看所有学生信息:以表格形式展示所有学生。
  • 根据学号查询学生信息
  • 根据学号修改学生信息
  • 根据学号删除学生信息
  • 数据持久化:学生信息能够保存在文件中,程序关闭后重新打开,数据依然存在。

技术栈

  • 核心语言: Java (建议使用 JDK 8 或更高版本)
  • 开发工具: IntelliJ IDEA (强烈推荐) 或 Eclipse
  • 数据存储: 文件存储 (使用 .txt.csv 格式)
  • 项目构建: Maven (可选,但推荐用于管理依赖和项目结构)

开发环境搭建

  1. 安装 JDK: 从 Oracle 官网或 OpenJDK 官网下载并安装 JDK。
  2. 安装 IDE: 下载并安装 IntelliJ IDEA Community Edition (免费版)。
  3. 配置环境变量: 确保 JAVA_HOMEPATH 环境变量已正确配置。
  4. 验证安装: 打开终端或命令提示符,输入 java -versionjavac -version,如果显示版本号,则说明安装成功。

第二部分:项目设计与架构

在敲代码之前,先进行设计是至关重要的,一个好的设计能让项目结构清晰,易于维护和扩展。

核心类设计

我们将创建以下几个核心类:

  • Student (学生类 - Model/Entity): 一个简单的Java类(POJO),用于封装单个学生的信息。

    • 属性: id (学号), name (姓名), age (年龄), gender (性别)
    • 方法: 构造方法、Getter 和 Setter 方法、toString() 方法。
  • StudentManager (学生管理类 - Service/Logic): 项目的核心逻辑类,负责处理所有的业务操作。

    • 属性: 一个 List<Student> 对象,用于在内存中存储所有学生。
    • 方法:
      • addStudent(Student student): 添加学生。
      • findAllStudents(): 查找所有学生。
      • findStudentById(String id): 根据ID查找学生。
      • updateStudent(String id, Student newStudent): 更新学生信息。
      • deleteStudent(String id): 删除学生。
      • saveToFile(): 将学生列表保存到文件。
      • loadFromFile(): 从文件加载学生数据。
  • Main (主程序类 - Entry Point): 程序的入口,负责显示菜单,接收用户输入,并调用 StudentManager 的方法来响应用户操作。

数据存储格式

我们选择使用 CSV (Comma-Separated Values) 格式来存储数据,因为它比纯文本更结构化,且可以用Excel等工具方便地查看。

文件名: students.csv 格式: id,name,age,gender 示例:

001,张三,18,男
002,李四,19,女
003,王五,20,男

第三部分:分步实现

创建项目与 Student

  1. 在 IntelliJ IDEA 中,选择 File -> New -> Project
  2. 选择 Java,确保 Project SDK 已选择你的 JDK 版本,点击 Next
  3. 输入项目名称(如 StudentManagementSystem),选择项目位置,点击 Finish
  4. src 目录下,创建一个新的包,com.example.model
  5. model 包下,创建 Student.java 类。

Student.java 代码:

package com.example.model;
public class Student {
    private String id;
    private String name;
    private int age;
    private String gender;
    // 构造方法
    public Student() {
    }
    public Student(String id, String name, int age, String gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    // Getter 和 Setter 方法
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    // 重写 toString() 方法,方便打印学生信息
    @Override
    public String toString() {
        return String.format("学号: %s, 姓名: %s, 年龄: %d, 性别: %s", id, name, age, gender);
    }
}

实现 StudentManager

  1. src 目录下创建一个新包 com.example.service
  2. service 包下创建 StudentManager.java 类。

StudentManager.java 代码:

package com.example.service;
import com.example.model.Student;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class StudentManager {
    private List<Student> studentList;
    private static final String FILE_NAME = "students.csv";
    public StudentManager() {
        studentList = new ArrayList<>();
        // 程序启动时,从文件加载数据
        loadFromFile();
    }
    // 添加学生
    public void addStudent(Student student) {
        // 检查学号是否已存在
        if (findStudentById(student.getId()) != null) {
            System.out.println("错误:学号 " + student.getId() + " 已存在!");
            return;
        }
        studentList.add(student);
        System.out.println("学生 " + student.getName() + " 添加成功!");
    }
    // 查找所有学生
    public List<Student> findAllStudents() {
        return studentList;
    }
    // 根据ID查找学生
    public Student findStudentById(String id) {
        for (Student student : studentList) {
            if (student.getId().equals(id)) {
                return student;
            }
        }
        return null;
    }
    // 更新学生信息
    public void updateStudent(String id, Student newStudent) {
        Student studentToUpdate = findStudentById(id);
        if (studentToUpdate != null) {
            studentToUpdate.setName(newStudent.getName());
            studentToUpdate.setAge(newStudent.getAge());
            studentToUpdate.setGender(newStudent.getGender());
            System.out.println("学号为 " + id + " 的学生信息更新成功!");
        } else {
            System.out.println("错误:未找到学号为 " + id + " 的学生!");
        }
    }
    // 删除学生
    public void deleteStudent(String id) {
        Student studentToDelete = findStudentById(id);
        if (studentToDelete != null) {
            studentList.remove(studentToDelete);
            System.out.println("学号为 " + id + " 的学生删除成功!");
        } else {
            System.out.println("错误:未找到学号为 " + id + " 的学生!");
        }
    }
    // 保存到文件
    public void saveToFile() {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME))) {
            for (Student student : studentList) {
                // 将学生对象转换为CSV格式的一行字符串
                String line = student.getId() + "," + student.getName() + "," + student.getAge() + "," + student.getGender();
                writer.write(line);
                writer.newLine(); // 写入换行符
            }
        } catch (IOException e) {
            System.err.println("保存数据到文件时出错: " + e.getMessage());
        }
    }
    // 从文件加载
    public void loadFromFile() {
        File file = new File(FILE_NAME);
        if (!file.exists()) {
            // 如果文件不存在,则无需加载
            return;
        }
        try (BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split(",");
                if (parts.length == 4) {
                    String id = parts[0];
                    String name = parts[1];
                    int age = Integer.parseInt(parts[2]);
                    String gender = parts[3];
                    studentList.add(new Student(id, name, age, gender));
                }
            }
        } catch (IOException | NumberFormatException e) {
            System.err.println("从文件加载数据时出错: " + e.getMessage());
        }
    }
}

实现 Main 类与用户交互

  1. src 目录下创建 com.example 包。
  2. com.example 包下创建 Main.java 类。

Main.java 代码:

package com.example;
import com.example.model.Student;
import com.example.service.StudentManager;
import java.util.List;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StudentManager manager = new StudentManager();
        while (true) {
            printMenu();
            System.out.print("请输入您的选择: ");
            int choice = scanner.nextInt();
            scanner.nextLine(); // 消费掉nextInt()留下的换行符
            switch (choice) {
                case 1:
                    addStudent(scanner, manager);
                    break;
                case 2:
                    listAllStudents(manager);
                    break;
                case 3:
                    findStudent(scanner, manager);
                    break;
                case 4:
                    updateStudent(scanner, manager);
                    break;
                case 5:
                    deleteStudent(scanner, manager);
                    break;
                case 6:
                    System.out.println("感谢使用,再见!");
                    manager.saveToFile(); // 退出前保存数据
                    scanner.close();
                    System.exit(0);
                default:
                    System.out.println("无效的选择,请重新输入!");
            }
            System.out.println(); // 打印空行,使界面更清晰
        }
    }
    private static void printMenu() {
        System.out.println("========== 学生信息管理系统 ==========");
        System.out.println("           1. 添加学生");
        System.out.println("           2. 查看所有学生");
        System.out.println("           3. 查询学生");
        System.out.println("           4. 修改学生信息");
        System.out.println("           5. 删除学生");
        System.out.println("           6. 退出系统");
        System.out.println("=====================================");
    }
    private static void addStudent(Scanner scanner, StudentManager manager) {
        System.out.println("--- 添加学生 ---");
        System.out.print("请输入学号: ");
        String id = scanner.nextLine();
        System.out.print("请输入姓名: ");
        String name = scanner.nextLine();
        System.out.print("请输入年龄: ");
        int age = scanner.nextInt();
        scanner.nextLine(); // 消费换行符
        System.out.print("请输入性别: ");
        String gender = scanner.nextLine();
        Student student = new Student(id, name, age, gender);
        manager.addStudent(student);
    }
    private static void listAllStudents(StudentManager manager) {
        System.out.println("--- 所有学生信息 ---");
        List<Student> students = manager.findAllStudents();
        if (students.isEmpty()) {
            System.out.println("当前没有学生信息。");
        } else {
            for (Student student : students) {
                System.out.println(student);
            }
        }
    }
    private static void findStudent(Scanner scanner, StudentManager manager) {
        System.out.println("--- 查询学生 ---");
        System.out.print("请输入要查询的学号: ");
        String id = scanner.nextLine();
        Student student = manager.findStudentById(id);
        if (student != null) {
            System.out.println("查询结果: " + student);
        } else {
            System.out.println("未找到学号为 " + id + " 的学生。");
        }
    }
    private static void updateStudent(Scanner scanner, StudentManager manager) {
        System.out.println("--- 修改学生信息 ---");
        System.out.print("请输入要修改的学生学号: ");
        String id = scanner.nextLine();
        Student existingStudent = manager.findStudentById(id);
        if (existingStudent == null) {
            System.out.println("未找到该学生,无法修改。");
            return;
        }
        System.out.print("请输入新姓名 (原: " + existingStudent.getName() + "): ");
        String name = scanner.nextLine();
        System.out.print("请输入新年龄 (原: " + existingStudent.getAge() + "): ");
        int age = scanner.nextInt();
        scanner.nextLine(); // 消费换行符
        System.out.print("请输入新性别 (原: " + existingStudent.getGender() + "): ");
        String gender = scanner.nextLine();
        Student newStudent = new Student(id, name, age, gender);
        manager.updateStudent(id, newStudent);
    }
    private static void deleteStudent(Scanner scanner, StudentManager manager) {
        System.out.println("--- 删除学生 ---");
        System.out.print("请输入要删除的学生学号: ");
        String id = scanner.nextLine();
        manager.deleteStudent(id);
    }
}

第四部分:项目运行与测试

  1. 编译与运行: 在 IntelliJ IDEA 中,直接点击 Main.java 文件旁边的绿色运行按钮。
  2. 测试流程:
    • 添加: 选择 1,输入几个学生的信息。
    • 查看: 选择 2,检查是否所有学生都被正确显示。
    • 查询: 选择 3,输入一个已存在的学号,看是否能查到。
    • 修改: 选择 4,修改一个学生的信息,然后选择 23 验证修改是否成功。
    • 删除: 选择 5,删除一个学生,然后选择 2 验证是否已删除。
    • 退出: 选择 6,程序会退出,检查你的项目根目录下是否生成了 students.csv 文件。
  3. 重启测试: 再次运行程序,选择 2 查看所有学生,你会发现之前添加的学生信息依然存在,这证明了数据持久化功能正常工作。

第五部分:项目扩展与优化建议

当你完成了这个基础版本后,可以尝试以下扩展来提升你的技能:

  1. 使用数据库存储: 将 students.csv 替换为 MySQL 或 SQLite 数据库,你需要学习 JDBC(Java Database Connectivity)来连接和操作数据库。
  2. 引入 GUI 界面: 使用 JavaFX 或 Swing 创建图形用户界面,让操作更直观。
  3. 使用集合框架优化: 学习使用 Map(如 HashMap)来存储学生,以学号为 key,可以极大地提高查询效率(从 O(n) 到 O(1))。
  4. 代码重构与设计模式:
    • Main 类中的 switch-case 逻辑抽取到独立的 MenuService 类中。
    • 学习使用 MVC (Model-View-Controller) 设计模式来重构项目,使代码结构更清晰、职责更分明。
    • 使用 工厂模式建造者模式 来创建 Student 对象。
  5. 单元测试: 使用 JUnit 为 StudentManager 类的方法编写单元测试,确保代码的正确性。
  6. 构建工具: 学习使用 Maven 或 Gradle 来管理项目依赖和构建过程。
  7. 异常处理: 创建自定义异常类(如 StudentNotFoundException),使错误处理更加优雅和专业。

这个项目从零开始,带你走完了整个Java应用程序的生命周期:需求分析、设计、编码、测试,希望这份详细的教程能对你有所帮助!祝你编程愉快!

分享:
扫描分享到社交APP
上一篇
下一篇