1

現在、私は修正しようとしている 3 つのクラスを持つ小さな練習の初心者プログラムに取り組んでいます。作成されたオブジェクトの総数を計算するようにクラス Student を変更し、Student クラスの配列が含まれるようにクラス Course を変更したいと考えています。これが私がこれまでに持っているものです。任意の支援をいただければ幸いです。私はそれが明らかだと確信しています、そして私はただ密集しています:

クラスコース:

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. スタイルにもっと注意を払う必要があります。

    • の宣言は、変な場所で 2 行に分割されているため、Studentという変数の宣言のstudents ように見えます。

    • への引数の宣言addStudentが間違っています。変数名を大文字で始めないでください。決してありません。この場合、! というクラスも持っているため、これは二重に間違っています。Student

      Java コンパイラは、同じ名前のクラスと変数が存在するコードを処理できるようになりました。(JLS には、混乱を解決するための規則があります。) 問題は、コードが、あなたが思っていることを意味していない可能性があることです...そして、それは悪いことです!!

  2. このステートメントは無効です: Student[numberOfStudents] = students[];。問題は、RHS が式である必要があり、式でstudents[]はないことです。

  3. しかし、このaddStudent方法の根本的な問題は、それが意味をなさないことです。ここで実際に何をしようとしていますか?を配列に追加しStudentますか? studentsもしそうなら、なぜ文字列の配列を渡すのですか? そして、なぜその文字列の配列に何かを代入しようとしているのですか?

    addStudentの署名をに変更する必要があると思いますaddStudent(Student)。次に、そのメソッド署名に依存する他のさまざまなものを変更します...メソッドを呼び出す場所を含めます。

  4. students最後に、の配列として宣言するのは悪い考えですStudent。問題は、配列の上限が固定されていることです。その境界を超えると、実行時例外が発生します。この場合、 に 100 個を超えるとコードがクラッシュStudentsしますCourse

    これに対処するにはさまざまな方法がありますが、最も簡単なのは a のList<Student>代わりに aを使用することStudent[]です。これは、メソッドを実装するときにも役立ちますdropStudent

于 2013-09-06T02:55:52.213 に答える
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] + ", ");
}
}
于 2013-09-06T02:50:35.300 に答える
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 に答える