Java 面向对象编程 (OOP) 与学生管理系统示例

面向对象编程概述

        面向对象编程(OOP)是一种编程范式,通过将代码组织成对象来进行建模和设计。对象是类的实例,类则是对象的蓝图。OOP 主要有四个基本特性:封装、继承、多态和抽象。

关键词解析

1. Object

   Object 是 Java 中所有类的超类。每个类都直接或间接继承自 Object 类。Object 提供了许多通用的方法,如 equals()hashCode()toString() 等。

2. static

  static 关键字用于表示类的静态成员。静态成员属于类本身,而不是类的实例。这意味着可以不创建类的实例而直接访问静态成员。

3. public, private, protected

  • public: 访问修饰符,表示成员可以被任何类访问。
  • private: 访问修饰符,表示成员只能在定义它的类内部访问。
  • protected: 访问修饰符,表示成员可以在定义它的类、同包中的类以及它的子类中访问。

4. finalize()

  finalize()Object 类的方法,在垃圾收集器回收对象之前调用。通常用于清理资源,但因为不确定何时调用,推荐使用 try-with-resources 或显式清理方法。

5. equals()

  equals() 方法用于比较两个对象的内容是否相等。默认实现是比较对象的引用,但可以重写该方法来比较对象的属性。

6. hashCode()

hashCode() 方法返回对象的哈希码,用于哈希表(如 HashMap)中对象的存储。通常需要与 equals() 方法一起重写。

7. extends

extends 关键字用于表示类的继承。子类继承父类的属性和方法,可以重写父类的方法。

8. interface

  interface 是一种特殊的类,完全由抽象方法组成。类通过 implements 关键字实现接口。一个类可以实现多个接口。

9. implements

implements 关键字用于表示类实现一个或多个接口。类必须实现接口中所有的方法。

10. toString()

toString() 方法返回对象的字符串表示。默认实现是对象的类名和哈希码,可以重写该方法以提供更有意义的字符串表示。

11. 抽象类

       抽象类是不能实例化的类,可以包含抽象方法(没有方法体的方法)。子类必须实现所有抽象方法。抽象类通过 abstract 关键字定义。

12. 接口

接口是一种纯抽象类,定义了类必须实现的方法。接口用于定义类的行为标准,而不涉及具体实现。

示例代码分析

下面我们通过一个学生管理系统的示例代码来演示这些概念的应用。

学生接口 (IStudent)

package com.ffyc.work;

/**
 * 学生管理接口,定义学生管理系统需要实现的方法
 */
public interface IStudent {
    /**
     * 添加学生对象
     * @param student 学生对象
     */
    void addStudent(Student student);

    /**
     * 找出某科目的最高分学生信息
     * @param subject 科目
     * @return 学生对象
     */
    Student findMaxSubject(String subject);

    /**
     * 找出某科目的最低分学生信息
     * @param subject 科目
     * @return 学生对象
     */
    Student findMinSubject(String subject);

    /**
     * 计算某科目的平均分
     * @param subject 科目
     * @return 平均分
     */
    double subjectAvg(String subject);

    /**
     * 计算某科目的总分
     * @param subject 科目
     * @return 总分
     */
    double subjectSum(String subject);

    /**
     * 计算某门课的通过率
     * @param subject 科目
     * @return 通过率
     */
    double subjectPassPencent(String subject);

    /**
     * 统计不合格的学生人数
     * @return 不合格人数
     */
    int countFail();

    /**
     * 删除学生对象
     * @param id 学生学号
     */
    void deleteStudent(String id);

    /**
     * 按性别统计学生人数
     * @param gender 性别
     * @return 学生人数
     */
    int countGenger(String gender);
}

        这是一个接口,定义了学生管理系统需要实现的方法。IStudent 定义了添加学生、查找最大/最小分数、计算平均分/总分、计算通过率、统计不合格人数、删除学生和按性别统计学生人数的方法。

学生类 (Student)

package com.ffyc.work;

/**
 * 学生类,表示一个学生对象
 */
public class Student {
    private String id;      // 学号
    private String name;    // 姓名
    private String gender;  // 性别
    private String subject; // 科目
    private double score;   // 分数

    /**
     * 无参构造函数
     */
    public Student() {}

    /**
     * 有参构造函数
     * @param id 学号
     * @param name 姓名
     * @param gender 性别
     * @param subject 科目
     * @param score 分数
     */
    public Student(String id, String name, String gender, String subject, double score) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.subject = subject;
        this.score = score;
    }

    // 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 String getGender() { return gender; }
    public void setGender(String gender) { this.gender = gender; }
    public String getSubject() { return subject; }
    public void setSubject(String subject) { this.subject = subject; }
    public double getScore() { return score; }
    public void setScore(double score) { this.score = score; }

    /**
     * 重写 toString 方法,返回学生对象的字符串表示
     * @return 学生对象的字符串表示
     */
    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", subject='" + subject + '\'' +
                ", score=" + score +
                '}';
    }
}

        Student 类表示一个学生对象,包含学生的基本信息(学号、姓名、性别、科目和分数)。类中包含构造函数、getter 和 setter 方法,以及重写的 toString() 方法。

学生服务类 (StudentService)

package com.ffyc.work;

/**
 * 学生服务类,实现学生管理接口
 */
public class StudentService implements IStudent {
    private Student[] students = new Student[20]; // 存储学生对象的数组
    private int index; // 数组的当前位置索引

    @Override
    public void addStudent(Student student) {
        students[index++] = student;
    }

    @Override
    public Student findMaxSubject(String subject) {
        double max = 0;
        int pos = 0;
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if (subject.equals(s.getSubject())) {
                if (s.getScore() > max) {
                    max = s.getScore();
                    pos = i;
                }
            }
        }
        return students[pos];
    }

    @Override
    public Student findMinSubject(String subject) {
        double min = Double.MAX_VALUE;
        int pos = 0;
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if (subject.equals(s.getSubject())) {
                if (s.getScore() < min) {
                    min = s.getScore();
                    pos = i;
                }
            }
        }
        return students[pos];
    }

    @Override
    public double subjectAvg(String subject) {
        double sum = 0;
        int t = 0;
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if(subject.equals(s.getSubject())) {
                sum += s.getScore();
                t++;
            }
        }
        return sum / t;
    }

    @Override
    public double subjectSum(String subject) {
        double sum = 0;
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if(subject.equals(s.getSubject()))
                sum += s.getScore();
        }
        return sum;
    }

    @Override
    public double subjectPassPencent(String subject) {
        double passCount = 0;
        int totalCount = 0;
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if(s.getSubject().equals(subject)) {
                totalCount++;
                if (s.getScore() >= 60)
                    passCount++;
            }
        }
        return (passCount / totalCount) * 100;
    }

    @Override
    public int countFail() {
        int count = 0;
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if(s.getScore() < 60)
                count++;
        }
        return count;
    }

    @Override
    public void deleteStudent(String id) {
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if(s.getId().equals(id)){
                // 将剩余元素左移
                for (int j = i; j < index - 1; j++) {
                    students[j] = students[j + 1];
                }
                students[--index] = null;
                break;
            }
        }
    }

    @Override
    public int countGenger(String gender) {
        int count = 0;
        for (int i = 0; i < index; i++) {
            Student s = students[i];
            if (s.getGender().equals(gender)) {
                count++;
            }
        }
        return count;
    }
}

  StudentService 类实现了 IStudent 接口,提供了学生管理的具体实现。该类包含一个学生数组和当前学生的索引。实现了添加学生、查找最大/最小分数、计算平均分/总分、计算通过率、统计不合格人数、删除学生和按性别统计学生人数的方法。

测试类 (TestStudent)

package com.ffyc.work;

/**
 * 测试学生管理系统功能
 */
public class TestStudent {
    public static void main(String[] args) {
        // 创建学生对象
        Student s1 = new Student("snut001", "张三", "男", "数学", 85);
        Student s2 = new Student("snut002", "李四", "女", "数学", 95);
        Student s3 = new Student("snut003", "王五", "男", "数学", 75);
        Student s4 = new Student("snut004", "赵六", "女", "英语", 88);
        Student s5 = new Student("snut005", "孙七", "男", "英语", 92);

        // 创建学生服务对象
        StudentService studentService = new StudentService();

        // 添加学生
        studentService.addStudent(s1);
        studentService.addStudent(s2);
        studentService.addStudent(s3);
        studentService.addStudent(s4);
        studentService.addStudent(s5);

        // 打印学生信息
        System.out.println("学生信息:");
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
        System.out.println(s5);

        // 查找某科目最高分的学生
        System.out.println("\n数学科目最高分的学生:" + studentService.findMaxSubject("数学"));

        // 查找某科目最低分的学生
        System.out.println("数学科目最低分的学生:" + studentService.findMinSubject("数学"));

        // 计算某科目平均分
        System.out.println("数学科目平均分:" + studentService.subjectAvg("数学"));

        // 计算某科目总分
        System.out.println("数学科目总分:" + studentService.subjectSum("数学"));

        // 计算某科目通过率
        System.out.println("数学科目通过率:" + studentService.subjectPassPencent("数学") + "%");

        // 统计不合格的学生人数
        System.out.println("不合格的学生人数:" + studentService.countFail());

        // 删除学生
        studentService.deleteStudent("snut003");
        System.out.println("\n删除学生后学生信息:");
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s4);
        System.out.println(s5);

        // 按性别统计学生人数
        System.out.println("男生人数:" + studentService.countGenger("男"));
        System.out.println("女生人数:" + studentService.countGenger("女"));
    }
}

  TestStudent 类用于测试学生管理系统的功能。它创建了几个学生对象,使用 StudentService 对象来添加学生,查找最高分和最低分学生,计算平均分和总分,计算通过率,统计不合格学生人数,删除学生,并按性别统计学生人数。

        我们可以看到面向对象编程在学生管理系统中的应用。这些代码展示了如何使用类和对象来组织数据和行为,以及如何实现接口来提供系统的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值