要求:
使用常量定义成绩权值
设计一个测试类完成测试
思路:
首先,在Student
类中定义了私有的数据成员,包括学生的姓名、学号以及各科成绩。这些数据成员是私有的,只能通过类的方法来访问和修改它们,从而将数据的访问控制在类的内部。
然后,通过构造方法来初始化学生对象。构造方法在创建对象时被调用,可以接受参数并将其赋值给对应的数据成员,实现对对象的初始化。
接下来,为每个数据成员提供了设置成绩的方法,如setMathScore
、setEnglishScore
等。这些方法允许外部代码通过调用它们来修改学生的单科成绩。
然后,定义了两个计算成绩的方法:calculateAverageScore
和calculateWeightedTotalScore
。calculateAverageScore
方法用于计算学生的平均成绩,即将所有科目的成绩相加后除以科目数量。calculateWeightedTotalScore
方法用于计算学生的带权值总成绩,即将各科成绩乘以对应的权值并求和。
最后,使用StudentTest
类作为测试类,创建了一个学生对象,并进行了一系列的操作和计算,包括输出学生信息、修改成绩、计算平均成绩和带权值总成绩等。
整体思路是将学生的基本情况封装在一个类中,通过提供方法来操作和计算相关数据。这样的设计可以方便地对学生对象进行操作和计算。同时,通过测试类的使用,可以验证代码的正确性和功能的有效性。
难点分析:
类和对象的概念理解:理解类和对象的概念以及它们之间的关系是理解这段代码的重要基础。类是一种抽象的数据类型,用于封装数据和操作数据的方法;而对象是类的实例,通过创建对象来使用类定义的方法操作数据。
数据封装和访问控制:我使用私有数据成员来封装学生的姓名、学号和成绩信息,这意味着只能通过类的方法来访问和修改这些数据。理解数据封装的概念,并了解如何使用访问控制修饰符(如private、public等)来控制数据的访问范围是重要的。
构造方法的使用:构造方法在创建对象时被调用,用于进行对象的初始化。理解如何定义构造方法,并在创建对象时正确地调用构造方法进行初始化是必要的。
方法的定义和调用:代码中定义了多个方法,如设置成绩的方法和计算成绩的方法。理解如何定义方法,并了解如何通过对象调用方法来实现具体的操作和计算是关键。
测试类的使用:测试类StudentTest
用于验证代码的正确性和功能的有效性。理解如何编写测试类,并通过创建对象、调用方法和验证结果来进行代码的测试和调试是重要的。
代码:
// 学生类
class Student {
// 数据成员
private String name;
private String studentId;
private double mathScore;
private double englishScore;
private double computerScore;
private double politicsScore;
// 构造方法
public Student(String name, String studentId, double mathScore, double englishScore, double computerScore, double politicsScore) {
this.name = name;
this.studentId = studentId;
this.mathScore = mathScore;
this.englishScore = englishScore;
this.computerScore = computerScore;
this.politicsScore = politicsScore;
}
// 修改单科成绩的方法
public void setMathScore(double mathScore) {
this.mathScore = mathScore;
}
public void setEnglishScore(double englishScore) {
this.englishScore = englishScore;
}
public void setComputerScore(double computerScore) {
this.computerScore = computerScore;
}
public void setPoliticsScore(double politicsScore) {
this.politicsScore = politicsScore;
}
// 求平均成绩的方法
public double calculateAverageScore() {
return (mathScore + englishScore + computerScore + politicsScore) / 4;
}
// 求带权值的总成绩的方法
public double calculateWeightedTotalScore() {
final double MATH_WEIGHT = 0.3;
final double ENGLISH_WEIGHT = 0.2;
final double COMPUTER_WEIGHT = 0.3;
final double POLITICS_WEIGHT = 0.2;
return mathScore * MATH_WEIGHT + englishScore * ENGLISH_WEIGHT + computerScore * COMPUTER_WEIGHT + politicsScore * POLITICS_WEIGHT;
}
}
// 测试类
public class StudentTest {
public static void main(String[] args) {
// 创建学生对象并初始化数据
Student student = new Student("张三", "20210001", 80.5, 75.0, 90.0, 85.5);
// 输出学生信息及成绩
System.out.println("学生姓名:" + student.getName());
System.out.println("学号:" + student.getStudentId());
System.out.println("数学成绩:" + student.getMathScore());
System.out.println("英语成绩:" + student.getEnglishScore());
System.out.println("计算机成绩:" + student.getComputerScore());
System.out.println("政治成绩:" + student.getPoliticsScore());
// 修改单科成绩
student.setMathScore(85.0);
student.setEnglishScore(78.5);
// 输出修改后的成绩
System.out.println("\n修改后的成绩:");
System.out.println("数学成绩:" + student.getMathScore());
System.out.println("英语成绩:" + student.getEnglishScore());
// 计算平均成绩和带权值的总成绩
double averageScore = student.calculateAverageScore();
double weightedTotalScore = student.calculateWeightedTotalScore();
// 输出平均成绩和带权值的总成绩
System.out.println("\n平均成绩:" + averageScore);
System.out.println("带权值的总成绩:" + weightedTotalScore);
}
}