1

目前,我正在开发一个包含 3 个类的小型练习初学者程序,我正在尝试修改它。我想修改 Student 类,以便它计算创建的对象总数,并且我想修改类 Course 以便它包含 Student 类的数组。这是我到目前为止所拥有的;任何援助将不胜感激。我敢肯定它很明显,而且我只是很密集:

课堂课程:

public class Course {
  private String courseName;
  private Student[]
  students = new Student[100];
  private int numberOfStudents;

  public Course(String courseName) {
    this.courseName = courseName;
  }

  public void addStudent(String[] Student) {
    Student[numberOfStudents] = students[];
    numberOfStudents++;
  }

  public Student[] getStudents() {
    return students;
  }

  public int getNumberOfStudents() {
    return numberOfStudents;
  }  

  public String getCourseName() {
    return courseName;
  }  

  public void dropStudent(String student) {

  }
}

班级学生:

public class Student {
private int id;
private String name;
private java.util.Date dateCreated;

public Student(int ssn, String newName) {
    id = ssn;
    name = newName;
    dateCreated = new java.util.Date();
}

public int getID() {
    return id; 
}

public String getName() {
    return name;
}

public java.util.Date getDateCreated() {
    return dateCreated;
}
}

以及驱动类,TestCourse类:

public class TestCourse {
  public static void main(String[] args) {
     Course course1 = new Course("Data Structures");
     Course course2 = new Course("Database Systems");

course1.addStudent("Peter Jones",);
course1.addStudent("Brian Smith");
course1.addStudent("Anne Kennedy");

course2.addStudent("Peter Jones");
course2.addStudent("Steve Smith");

System.out.println("Number of students in " +course1.getCourseName() + ":  "
  + course1.getNumberOfStudents());
String[] students = course1.getStudents();
for (int i = 0; i < course1.getNumberOfStudents(); i++)
  System.out.print(students[i] + ", ");

System.out.println();

System.out.print("Number of students in " +course2.getCourseName() +":  "
  + course2.getNumberOfStudents());

System.out.println();

String[] students1 = course2.getStudents();
for (int i = 0; i < course2.getNumberOfStudents(); i++)
  System.out.print(students1[i] + ", ");
  }
}
4

4 回答 4

2

因为这是一个家庭作业,而且目的是让你学习,这里有一些提示

仔细看看这段代码:

  private Student[]
  students = new Student[100];

  public void addStudent(String[] Student) {
    Student[numberOfStudents] = students[];
    numberOfStudents++;
  }

提示:

  1. 你需要更加注意风格。

    • 的声明students 看起来像一个名为Student ... 的变量的声明,因为你在一个奇怪的地方将它分成两行。

    • 参数的声明addStudent是错误的。您不应该以大写字母开头的变量名。永远不会。在这种情况下,这是双重错误的,因为您还有一个名为Student!

      现在,Java 编译器可以处理存在同名类和变量的代码。(JLS 有解决混乱的规则。)问题是您的代码可能并不意味着您认为它意味着什么......这是一件坏事!

  2. 此声明无效:Student[numberOfStudents] = students[];。问题是 RHS 必须是一个表达式,而students[]不是一个表达式。

  3. 但该addStudent方法的根本问题是它没有意义。你到底在这里做什么?Studentstudents数组中添加一个?如果是这样,你为什么要传递一个字符串数组?你为什么要为那个字符串数组分配一些东西?

    我认为您需要将签名更改为addStudentto addStudent(Student)。然后更改依赖于该方法签名的各种其他内容......包括调用该方法的位置。

  4. 最后,声明studentsStudent. 问题是数组有一个固定的上限。如果超出该界限,则会出现运行时异常。在这种情况下,如果Students一个Course.

    有多种方法可以解决这个问题,但最简单的是使用 aList<Student>而不是 a Student[]。当您实现该dropStudent方法时,这也将有所帮助。

于 2013-09-06T02:55:52.213 回答
0

你说你想修改Student类来跟踪创建了多少对象。一种常见的方法是在类中添加一个静态字段,并在调用构造函数时将其递增:

public class Student {
    ...
    public static int globalStudents = 0;
    public Student() { globalStudents++; }
    ...
}

所有现有的构造函数都必须调用默认构造函数才能使其工作。例子:

public Student(int ssn, String newName) {
    this(); // default constructor
    id = ssn;
    name = newName;
    dateCreated = new java.util.Date();
}

如果你想在学生被摧毁时减少计数器,你可以使用finalize()(虽然我认为没有理由)。

您还说您希望Course拥有一系列学生,而您似乎已经拥有了。但是,最好使用动态容器,例如ArrayList. 托管列表的易用性和安全性非常严格,几乎没有理由不使用它们。

ArrayList<Student> myList = new ArrayList<Student>();
Student s = new Student(123456789, "Jimmy Russell");
myList.add(s);
于 2013-09-06T02:58:05.683 回答
0

尝试以下解决方案。我已经修复了一些编译错误。你应该能够做一个差异来知道它们是什么。希望这可以帮助。

public class Student {
private int id;
private String name;
private java.util.Date dateCreated;

public Student(int ssn, String newName) {
    id = ssn;
    name = newName;
    dateCreated = new java.util.Date();
}

public int getID() {
    return id;
}

public String getName() {
    return name;
}

public java.util.Date getDateCreated() {
    return dateCreated;
}

@Override
public String toString() {
    return name;
}
}

课程.java

public class Course {
private String courseName;
private Student[] students = new Student[100];
private int numberOfStudents;

public Course(String courseName) {
    this.courseName = courseName;
}

public void addStudent(String student) {
    this.students[numberOfStudents] = new Student(0,student);
    numberOfStudents++;
}

public Student[] getStudents() {
    return students;
}

public int getNumberOfStudents() {
    return numberOfStudents;
}

public String getCourseName() {
    return courseName;
}

public void dropStudent(String student) {
}
}

测试课程.java

public class TestCourse {
public static void main(String[] args) {
    Course course1 = new Course("Data Structures");
    Course course2 = new Course("Database Systems");

    course1.addStudent("Peter Jones");
    course1.addStudent("Brian Smith");
    course1.addStudent("Anne Kennedy");

    course2.addStudent("Peter Jones");
    course2.addStudent("Steve Smith");

    System.out.println("Number of students in " + course1.getCourseName() + ":  " + course1.getNumberOfStudents());
    Student[] students = course1.getStudents();
    for (int i = 0; i < course1.getNumberOfStudents(); i++)
        System.out.print(students[i] + ", ");

    System.out.println();

    System.out.print("Number of students in " + course2.getCourseName() + ":  " + course2.getNumberOfStudents());

    System.out.println();

    Student[] students1 = course2.getStudents();
    for (int i = 0; i < course2.getNumberOfStudents(); i++)
        System.out.print(students1[i] + ", ");
}
}
于 2013-09-06T02:50:35.300 回答
0

您提供的代码存在许多问题,所以我建议您需要刷新一些基本概念......

在您的Course课程中,您定义了一个addStudent方法...

public void addStudent(String[] Student) {
    Student[numberOfStudents] = students[];
    numberOfStudents++;
}

这甚至没有意义...Student未定义为变量(实际上是 a class),然后您似乎试图将其分配students[]给它...现在被定义为类中students的数组,但是语法只是没有意义。studentsCourse

你也完全忽略了student变量,它是一种String类型,所以我什至不确定你是如何认为你可以将它分配给任何东西的......相反,你应该尝试做类似(我认为)......

public void addStudent(Student student) {
    if (numberOfStudents < 100) {
        students[numberOfStudents] = student;
        numberOfStudents++;
    }
}

这将检查是否有足够的可用空间,如果可以,将学生分配到下一个可用空间。Exception如果课程已满,该方法“应该”抛出一个,但至少要先运行基础知识......

现在这将为您的main方法解决问题,因为addStudent不再接受 a String,而是期望Student...

// Create a re-usable reference to Peter...
Student peter = new Student(123, "Peter Jones");   
course1.addStudent(peter);
course1.addStudent(new Student(456, "Brian Smith"));
course1.addStudent(new Student(789, "Anne Kennedy"));

course2.addStudent(peter);
course2.addStudent(new Student(135, "Steve Smith"));

现在应该让事情运行得更多

于 2013-09-06T02:52:40.950 回答