0

私には3つのクラスがあります: Course、、。トランスクリプトには、次のようなコースを追加する機能があります。CourseEntryTranscript

public class Transcript {
    CourseEntry coursestaken[] = new CourseEntry[6];

    public void addCourse(Course course)
    {
        coursestaken[lastIndexOf(getCoursestaken())] = new CourseEntry(course);
    }
    (lastIndexOf gives me the empty array index - it's working on)

そして私の中でCourseEntry

public class CourseEntry {
    Course course;
    char grade = 'I';

    public CourseEntry(Course course)
    {
        this.course = course;
    }

そして私の中でCourse

public  class Course {
    int courseNumber,credits;
    String courseName;

    public Course addNewCourse(int courseNumber, int credits, String courseName)
    {
        this.courseNumber = courseNumber;
        this.credits = credits;
        this.courseName = courseName;

        return this;
    }

私のメインでは:

Transcript t = new Transcript();
Course course = new Course();

Course matematik = course.addNewCourse(1, 2, "Matematik");
t.addCourse(matematik);

Course turkce = course.addNewCourse(1, 4, "Türkçe");
t.addCourse(turkce);

ただし、coursestaken配列をループすると、最後に挿入されたすべてのインデックスが出力されます。

どうすればそれを解決できますか?

ありがとう

4

2 に答える 2

7

Courseコースごとに新しいオブジェクトを作成する必要があります。addNewCourseメソッドは現在のCourseオブジェクトのみを変更します。Course次のように変更します。

public class Course {
    private final int courseNumber;
    private final int credits;
    private final String courseName;

    public Course(int courseNumber, int credits, String courseName) {
        this.courseNumber = courseNumber;
        this.credits = credits;
        this.courseName = courseName;
    }

    public int getCourseNumber() {
        return courseNumber;
    }

    public int getCredits() {
        return credits;
    }

    public String getCourseName() {
        return courseName;
    }
}

そして、以下を使用します。

Transcript t = new Transcript();

Course matematik = new Course(1, 2, "Matematik");
t.addCourse(matematik);

Course turkce = new Course(1, 4, "Türkçe");
t.addCourse(turkce);
于 2013-01-15T21:04:30.050 に答える
3

オブジェクトはJavaの参照、つまりオブジェクトへのポインタです。だからあなたがするとき:

Object a = new Object();
Object b = a;

オブジェクト全体abにコピーするのではなく、への参照をabメモリアドレス)にコピーします。したがって、abは両方とも、によって作成されたオブジェクトへの参照newです。

何が起こっているかを確認するために、コードに従ってみましょう。

Course course = new Course();
Course matematik = course.addNewCourse(1, 2, "Matematik");
    this.courseNumber = courseNumber;
    this.credits = credits;
    this.courseName = courseName;
    return this;

ここでcourseオブジェクトを変更しました。matematikこれもcourse同じオブジェクトを指しているためと同じです。

Course turkce = course.addNewCourse(1, 4, "Türkçe");

ここでcourse再度変更します。courseこれで、turkcematematikはすべて、最初に。で作成した同じオブジェクトを参照していますCourse course = new Course();

これを修正する最も簡単な方法は、パラメーターを使用してコンストラクターを作成することだと思います。

public class Course {
...
     public Course(int courseNumber,int credits,String courseName) {
           this.courseNumber = courseNumber;
           this.credits = credits;
           this.courseName = courseName;
     }
}

その後

  Course matematik = new Course(1, 2, "Matematik");
  t.addCourse(matematik);

  Course turkce = new Course(1, 4, "Türkçe");
  t.addCourse(turkce);
于 2013-01-15T21:12:35.413 に答える