只是为了减少我想要做的事情,这是我教授给我的HW:
Int Test1,test2,test3 双倍平均 字符串等级
它有方法computeaverage()和calculategrade()。等级基于平均值,大于90 A,80到90 a B,70到80 a C等。所有其他属性都有一组和一个get。
有人说......
星期四,我看到了他从老师那里得到的同学代码,他在第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;
}
}
答案 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
类中有两个构造函数:
int
,int
,int
,String
,String
)这称为方法/函数重载。您可以使用同名声明许多方法,但签名必须更改。换句话说,它必须具有不同的参数(因此编译器将知道要使用的方法的版本)。
所以你有一个没有参数的构造函数,只需将test1
,test2
,test3
和average
设置为0.你有这个构造函数:
public Student(int test1, int test2, int test3, String firstName, String lastName)
{
this.test1 = test1;
this.test2 = test2;
this.test3 = test3;
...
}
接收4
个参数并将它们分配到相应的字段。
注意您也应该在构造函数中初始化average
,以及设置firstName
和lastName
:
this.average = 0; // Or maybe 'this.average = computeAverage();'
this.firstName = firstName;
this.lastName = lastName;
答案 3 :(得分:0)
他的实例变量(在学生开头声明的变量)是public
,这使他可以直接访问和更改它们,而无需使用setter和getter。通常,这些变量是私有的,需要方法来访问/更改它们。