【问题标题】:How to create arrays with object classes in java [HOMEWORK]如何在 java 中创建带有对象类的数组 [家庭作业]
【发布时间】:2021-08-11 20:48:34
【问题描述】:

在您阅读之前,这是我的家庭作业,并且会非常具体。

我是面向对象编程的新手,目前我很难掌握新概念。我的任务是从包含两个文件的对象类中获取信息。一个文件用于封装函数,而另一个文件用于实现函数并执行代码(public static void 文件)。所以对于我坚持的部分,我不确定如何做到这一点。我的输出目标是让这个得到学生的测验分数。我尝试的是使用数组来收集学生的测验分数并找到所有学生的总平均值。我在收集测验分数时遇到的问题是数组总是给我错误和红线,并说即使我在主文件中有函数也不存在类。

这是封装函数的代码:

public class Student {
    // instance fields
    private String firsName;
    private String surName;
    private long studentNumber;

}

//constuctors

    public Student(String firstName, String surName, long studentNumber){

    }

    //accessors and mutator methods

//set student's name and surname. Changing student's name does not affect the students's loginId
    public void setName(String firstName, String surName){

}

//returns name and surname separated by comma (name, surname)
public String getName(){
    return firsName + ", " + surName;
}

public long getStudentNumber(){
    return studentNumber;
}

public String getLoginId(){
    return firsName.charAt(0) + surName.substring(0,4) + studentNumber % 100;
}

public String getInfo(){
    return firsName + ", " + surName + "( " + getLoginId() + ", " + getStudentNumber() + ")";
}

public void setAddress(String number, String street, String city, String province, String postalCode){

}

public String getAddress(){
    String address = getAddress();
    return address;
}

//add a quiz score to the student
public void addQuiz(double quiz){
    double [] quizMarks;
    quizMarks = new double[]{ };
}

public double getQuizAverage(){

}


public String toString(){

}

这是测试用例 AKA 主文件的代码:

class StudentTester{
    public static void main(String[] args){
        // test Student constructor
        Student student = new Student("Marry","jones",10000001);
        System.out.println(student); 

        // test Student getName, getStudentNumber(), getLoginId()
        System.out.println(student.getName());
        System.out.println(student.getStudentNumber());
        System.out.println(student.getLoginId());

        // test Student getInfo()
        System.out.println(student.getInfo());

        // test Student addQuiz and getAverage
        student.addQuiz(6.0);
        student.addQuiz(8.5);
        student.addQuiz(9.8);
        System.out.println(student.getQuizAverage());

        // add your test cases:
    }
}

【问题讨论】:

  • 好的,有红线。但是,如果您尝试编译代码,您会得到什么错误?
  • StudentTester类中是否导入了Student类?
  • @Marlon 应该是

标签: java arrays function object


【解决方案1】:

由于这是针对初学者的家庭作业,因此我将尽可能简化代码。请注意,还有许多其他方法可以编写执行练习要求的代码。

您需要使变量 quizMarks 成为类 Student 的成员,以便该变量在您创建的 Student 对象的生命周期内存在(通过在方法 Student 中调用类 Student 的构造函数@类StudentTester)。当您在方法中声明变量时,该变量仅在该方法执行时存在。一旦方法终止,变量就不再存在。这称为变量的scope

数组的问题在于它有固定数量的元素。所以如果你想给数组quizMarks添加一个测验标记,你可能需要增加数组中的元素个数。或者,您可以使用ArrayList,但我猜您可能还没有了解该类,因此您可能不允许在代码中使用它。

这是我的课程版本Student。请注意,我将方法 main 添加到类 Student 以执行您的测试,而不是单独的 StudentTester 类,只是为了尽量减少此答案中的代码量。

public class Student {
    private String firsName;
    private String surName;
    private long studentNumber;
    private double[] quizMarks;

    public Student(String firsName, String surName, long studentNumber) {
        this.firsName = firsName;
        this.surName = surName;
        this.studentNumber = studentNumber;
        quizMarks = new double[0];
    }

    public String getFirsName() {
        return firsName;
    }

    public void setFirsName(String firsName) {
        this.firsName = firsName;
    }

    public String getSurName() {
        return surName;
    }

    public void setSurName(String surName) {
        this.surName = surName;
    }

    public long getStudentNumber() {
        return studentNumber;
    }

    public void setStudentNumber(long studentNumber) {
        this.studentNumber = studentNumber;
    }

    public String toString() {
        return String.format("%d %s %s", studentNumber, firsName, surName);
    }

    public void addQuiz(double quiz) {
        double[] temp = new double[quizMarks.length + 1];
        for (int i = 0; i < quizMarks.length; i++) {
            temp[i] = quizMarks[i];
        }
        temp[quizMarks.length] = quiz;
        quizMarks = temp;
    }

    public double getQuizAverage() {
        double average = 0;
        if (quizMarks.length > 0) {
            double total = 0;
            for (int i = 0; i < quizMarks.length; i++) {
                total += quizMarks[i];
            }
            average = total / quizMarks.length;
        }
        return average;
    }

    public static void main(String[] args) {
        Student student = new Student("Marry","jones",10000001);
        System.out.println(student);
        student.addQuiz(6.0);
        student.addQuiz(8.5);
        student.addQuiz(9.8);
        System.out.println(student.getQuizAverage());
    }
}
  • Student 类的构造函数中,我最初将quizMarks 中的元素数量设置为0(零)。
  • 在方法addQuiz 中,我创建了一个大小比quizMarks 大一的新数组。然后我将quizMarks 中的所有值复制到新数组中,最后将新测验标记添加到数组中,然后将quizMarks 设置为等于新数组。现在quizMarks 比调用addQuiz 方法之前多了一个元素。
  • 计算平均测验分数只是执行一些算术运算,即将quizMarks 中的所有分数相加,然后除以quizMarks 中的元素数。
  • 在方法getQuizAverage 中,我检查quizMarks 是否包含至少一个元素,因为将double 除以零会返回NaN(不是数字)。

这是我运行上述代码时得到的输出。

10000001 Marry jones
8.1

【讨论】:

    【解决方案2】:

    我希望这就是你要找的。​​p>

    Array studentArray = new Array<Student>();
    
    Student student = new Student("Marry","jones",10000001);
    
    studentArray.push(student);
    

    【讨论】:

    • 原谅我的无知,但我在JDK的API documentation中找不到方法pushArray 类不是 JDK 的一部分吗?
    • 这不是在 Java 中创建新数组的正确方法。你会使用Student[] studentArray = new Student[] { student }
    • 是的,你是对的,我混合了 java 和 js。谢谢指正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多