学生对象java的数组

时间:2014-01-26 18:12:07

标签: java arrays

只是为了减少我想要做的事情,这是我教授给我的HW:

  1. 定义一个扩展Person的类Student。它添加了属性
  2. Int Test1,test2,test3 双倍平均 字符串等级

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

    1. 编写一个使用20号学生类型数组的应用程序。该程序会提示用户有多少学生在课堂上,然后允许他们输入学生和他们的考试成绩,然后计算他们的成绩并打印出来学生名单及其成绩。
    2. 有人说......

      星期四,我看到了他从老师那里得到的同学代码,他在第37行(学生建设者)的学生班上有一些我以前没见过的东西。他没有使用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;
          }
      
      
      
      }
      

4 个答案:

答案 0 :(得分:0)

通常,您需要尽可能地封装字段。这意味着制作这些

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Student类中有两个构造函数

  • 不带参数的构造函数
  • 包含参数的构造函数(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;

答案 3 :(得分:0)

他的实例变量(在学生开头声明的变量)是public,这使他可以直接访问和更改它们,而无需使用setter和getter。通常,这些变量是私有的,需要方法来访问/更改它们。