Java - 修改类以计算创建的对象总数

时间:2013-09-06 02:34:50

标签: java arrays

目前,我正在开发一个包含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 个答案:

答案 0 :(得分:2)

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

仔细看看这段代码:

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

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

提示:

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

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

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

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

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

  3. addStudent方法的根本问题在于它没有意义。你实际试图在这做什么?在Student数组中添加students?如果是这样,为什么要传递一个字符串数组?你为什么要尝试为字符串数组赋值?

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

  4. 最后,将students声明为Student数组是个不错的主意。问题是数组有一个固定的上限。如果超过该范围,则会出现运行时异常。在这种情况下,如果Students中有CourseList<Student>,则代码会崩溃。

    有多种方法可以解决这个问题,但最简单的方法是使用Student[]代替dropStudent。这在您实施{{1}}方法时也会有所帮助。

答案 1 :(得分: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;
}
}

Course.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) {
}
}

TestCourse.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] + ", ");
}
}

答案 2 :(得分:0)

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

Course课程中,您定义了addStudent方法......

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

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

你也完全忽略String变量,这是一个public void addStudent(Student student) { if (numberOfStudents < 100) { students[numberOfStudents] = student; numberOfStudents++; } } 类型,所以我甚至不确定你是怎么想的,你可以把它分配给任何东西....相反,你应该试图做(我认为)......

Exception

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

这将解决您的addStudent方法的问题,因为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")); ...

{{1}}

现在应该让事情变得更多了

答案 3 :(得分: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);