目前,我正在开发一个包含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] + ", ");
}
}
答案 0 :(得分:2)
因为这是一项家庭作业,而且目的是让你学习,这里有几点提示
仔细看看这段代码:
private Student[]
students = new Student[100];
public void addStudent(String[] Student) {
Student[numberOfStudents] = students[];
numberOfStudents++;
}
提示:
你需要更加注重风格。
students
的声明看起来像一个名为学生的变量的声明...因为你在一个奇怪的地方将它分成两行的地方。
向addStudent
声明参数是错误的。您不应该使用大写字母启动变量名称。永远不会。在这种情况下,这是双重错误,因为你还有一个名为Student
的类!
现在,Java编译器可以处理存在类和具有相同名称的变量的代码。 (JLS有解决问题的规则。)问题是你的代码可能并不意味着你认为它意味着什么......这是一件坏事!!
此声明无效:Student[numberOfStudents] = students[];
。问题是RHS必须是表达式,students[]
不是表达式。
但addStudent
方法的根本问题在于它没有意义。你实际试图在这做什么?在Student
数组中添加students
?如果是这样,为什么要传递一个字符串数组?你为什么要尝试为字符串数组赋值?
我认为您需要将addStudent
的签名更改为addStudent(Student)
。然后更改依赖于该方法签名的各种其他内容...包括您调用该方法的位置。
最后,将students
声明为Student
数组是个不错的主意。问题是数组有一个固定的上限。如果超过该范围,则会出现运行时异常。在这种情况下,如果Students
中有Course
个List<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);