'Array of Student objects java

Just to give a run down of what I am trying to do, here is the HW my professor gave me:

  1. Define a class Student which extends Person. It adds the attributes

Int Test1, test2, test3 Double average String grade

It has methods computeaverage() and calculategrade(). The grades are based on the average, with above 90 an A, 80 to 90 a B, 70 to 80 a C etc. All other attributes have a set and a get.

  1. Write an application that uses an array of type student of size 20. The program prompts the user for how many students are in the class and then allows them to enter the students and their test scores, then calculates their grades and prints out the list of students and their grades.

That being said...

On Thursday I saw a classmates code that he got from the teacher and he had something that I haven't seen before in my student class on line 37 (Student Constructor). Instead of having getters and setters he had code similar to what I have at line 37. But I have no idea what he did and the correct coding. So I was hoping someone here could tell me what I am doing wrong and how this code can get away without using getter and setter methods???

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;
    }



}


Solution 1:[1]

Your Person class is wrong. It has no attributes or methods. There's no reason to extend it, because it brings nothing to the party.

You don't need getters or setters if the attribute is visible to the public, but that doesn't mean it's a good idea.

Try thinking more like this:

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;
    }
}

Solution 2:[2]

There are two constructors in Studentclass:

  • Constructor without parameters
  • Constructor with paramers (int,int,int,String,String)

This is called method/function overloading. You can declare many method with the same name, but the signature has to change. In other words, it has to have different parameters (so the compiler will know which version of the method to use).

So you have one constructor without parameters, that just set test1, test2, test3 and average to 0. And you have this constructor:

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

that receives 4 parameters and assigns them to the respective fields.

Note that you should initialize average in the constructor too, as well as set firstName and lastName:

this.average = 0; // Or maybe 'this.average = computeAverage();'
this.firstName = firstName;
this.lastName = lastName;

Solution 3:[3]

Typically, you'll want to encapsulate your fields as much as possible. This means make these

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

things private. You'll then need getters and setters to access them from outside the class. That's a good thing. However, from inside the class, you can use them without getters or setters no problem.

Does this answer your question? I have no idea what is on line 37, as you didn't provide numbering. :)

Edit: In case you don't know, constructors can be overloaded. You have two different constructors, one with parameters, one without. You can choose which one you want to use to construct the class, you probably want to be using the second one.

If you have need for both constructors, one complete one and another one that uses default values, you might want to contemplate referencing the second constructor from inside the first, to avoid duplication of code. Like so:

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;
}

Solution 4:[4]

His instance variables (the variables declared at the beginning of Student) were public, which allowed him to access and change them directly without the use of setters and getters. Normally, these variables are private, requiring methods to access/change them.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 duffymo
Solution 2 Christian Tapia
Solution 3
Solution 4 A Parikh