首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >学生对象数组

学生对象数组
EN

Stack Overflow用户
提问于 2014-01-27 02:12:07
回答 4查看 24.1K关注 0票数 0

简单介绍一下我正在尝试做的事情,这是我的教授给我的HW:

  1. 定义了一个扩展Person的类。它添加了属性

Int Test1、test2、test3双倍平均字符串等级

它有方法computeaverage()和calculategrade()。等级是基于平均值的,大于90的A,80到90的B,70到80的C等等。所有其他属性都有一个set和一个get。

  1. 编写了一个应用程序,该应用程序使用大小为20的学生类型数组。该程序会提示用户输入班级中的学生人数,然后允许用户输入学生及其考试成绩,然后计算学生的成绩并打印出学生及其成绩的列表。

话虽如此..。

周四,我看到了他从老师那里得到的同学代码,他在我的学生班第37行(Student Constructor)上有一些我以前没有见过的东西。他没有使用getter和setter,而是编写了类似于我在第37行的代码。但我不知道他做了什么也不知道正确的编码。所以我希望这里有人能告诉我我做错了什么,以及这段代码如何在不使用getter和setter方法的情况下逃脱?

public class Person {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {



        Scanner kbd = new Scanner(System.in);
        Student newStudent = new Student();
        int size;

        System.out.println("Enter the amount of students:");
        size = kbd.nextInt();
        Student[] myStudent = new Student[size];
        String firstName;
        String lastName;
        int test1, test2, test3;
        Student s;

        for (int i=0; i < size; i++)
        {

        System.out.println("Enter first name of student: " + i);
        firstName = kbd.next();

        System.out.println("Enter last name if student: " +i);
        lastName = kbd.next();

        System.out.println("Please Enter first test score: ");
//        JOptionPane.showInputDialog("Please enter first test score:");
        test1= kbd.nextInt();

        System.out.println("Please enter second test score");
//        JOptionPane.showInputDialog("Please enter second test score:");
        test2= kbd.nextInt();

        System.out.println("Please enter third test score");
//        JOptionPane.showInputDialog("Please enter third test score:");
        test3=kbd.nextInt();

//        s = new Student (test1, test2, test3, firstName, lastName);
        myStudent[i].setTest1(test1);
        myStudent[i].setTest2(test2);
        myStudent[i].setTest3(test3);
        myStudent[i].setfName(fName);
        myStudent[i].setlName(lname);


        }
        for (int i = 0; i < size; i++)
        {
            System.out.println(myStudent[i].getGrade());
        }



    }
}


public class Student extends Person{

    int test1, test2, test3;
    double average;
    String grade, firstName, lastName;


    public Student() 
    {
        test1 = 0;
        test2 = 0;
        test3 = 0;
        average = 0;


    }




    public Student(int test1, int test2, int test3, String firstName, String lastName) 
    {
        this.test1 = test1;
        this.test2 = test2;
        this.test3 = test3;

        this.setfirstName = firstName;
    }


    public double computeAverage()
    {
        average = (test1 + test2 + test3)/3;
        return average;

    }

    public String calculateGrade()
    {
        average = computeAverage();

        if (average < 60){
            grade = "F";}
        else if (average < 70){
            grade = "D";}
        else if (average < 80){
            grade = "C";}
        else if (average < 90){
            grade = "B";}
        else {
            grade = "A";
        }
        return grade;
    }

    public int getTest1() {
        return test1;
    }

    public void setTest1(int test1) {
        this.test1 = test1;
    }

    public int getTest2() {
        return test2;
    }

    public void setTest2(int test2) {
        this.test2 = test2;
    }

    public int getTest3() {
        return test3;
    }

    public void setTest3(int test3) {
        this.test3 = test3;
    }

    public double getAverage() {
        return average;
    }

    public void setAverage(double average) {
        this.average = average;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }



}
EN

回答 4

Stack Overflow用户

发布于 2014-01-27 02:17:31

通常,您会希望尽可能多地封装字段。这意味着让这些

int test1, test2, test3;
double average;
String grade, firstName, lastName;

私事。然后,您将需要getter和setter来从类外部访问它们。这是一件好事。但是,在类内部,您可以在不使用getter或setter的情况下使用它们。

这回答了你的问题吗?我不知道37行是什么,因为您没有提供编号。:)

编辑:如果你不知道,构造函数可以被重载。你有两个不同的构造函数,一个有参数,一个没有。您可以选择使用哪一个来构造类,您可能希望使用第二个。

如果您需要两个构造函数,一个完整的构造函数和另一个使用默认值的构造函数,您可能会考虑从第一个构造函数内部引用第二个构造函数,以避免重复代码。如下所示:

public Student() {
    this(0,0,0);
}

public Student(int test1, int test2, int test3, String firstName, String lastName) {
    this.test1 = test1;
    this.test2 = test2;
    this.test3 = test3;
    this.average = 0;
    this.firstName = firstName;
    this.lastName = lastName;
}
票数 0
EN

Stack Overflow用户

发布于 2014-01-27 02:22:37

您的Person类错误。它没有属性或方法。没有理由延长它,因为它不会给党带来任何好处。

如果属性对公众可见,则不需要getter或setter,但这并不意味着这是一个好主意。

试着像这样思考:

public class Person {
    protected String firstName;
    protected String lastName;

    public Person(String f, String l) {
        this.firstName = f;
        this.lastName = l;
    }

    public String getFirstName() { return this.firstName; }
    public String getLastName() { return this.lastName; }
}

public class Student extends Person {
    public static final int MAX_GRADES = 3;
    private int numGrades = 0;
    private int maxGrades;
    private int [] grades;

    public Student(String f, String l) {
        this(f, l, MAX_GRADES);
    }

    public Student(String f, String l, int maxGrades) {
        super(f, l);
        this.maxGrades = (maxGrades > 0) ? maxGrades : MAX_GRADES;
        this.grades = new int[this.maxGrades];   
    }

    public void addGrade(int grade) {
        if (this.numGrades < this.maxGrades) {
            this.grades[numGrades++] = grade;
        }
    }

    public double getAverageGrade() { 
        double average = 0.0;
        if (this.numGrades > 0) {
            for (int i = 0; i < this.numGrades; ++i) {
                average += grade[i];
            }
            average /= this.numGrades;
        }
        return average;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2014-01-27 02:23:01

Student类中有两个构造函数:

不带参数的parameters

  • Constructor的
  • 构造函数(intintintStringString)

这称为方法/函数重载。您可以使用相同的名称声明许多方法,但签名必须更改。换句话说,它必须有不同的参数(这样编译器才能知道要使用哪个版本的方法)。

所以你有一个没有参数的构造函数,只需将test1test2test3average设置为0即可。你有这个构造器:

public Student(int test1, int test2, int test3, String firstName, String lastName) 
{
    this.test1 = test1;
    this.test2 = test2;
    this.test3 = test3;
    ...
}

它接收4参数并将它们分配给相应的字段。

请注意,您还应该在构造函数中初始化average,并设置firstNamelastName

this.average = 0; // Or maybe 'this.average = computeAverage();'
this.firstName = firstName;
this.lastName = lastName;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21367252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档