【问题标题】:Array withother classes - object - Java数组与其他类 - 对象 - Java
【发布时间】:2013-01-15 20:59:22
【问题描述】:

我有 3 个课程:CourseCourseEntryTranscript。在成绩单中,我有一个添加课程的功能,如下所示:

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);

但如果我循环 coursetaken 数组,它会打印最后插入的所有索引。

我该如何解决?

谢谢

【问题讨论】:

  • Course.addNewCourse mutates/changes/updates 当前对象(并且不会将其“添加”到任何内容中)。相反,删除该方法并使用new Course(应更新构造函数以获取 courseNumber、credits、courseName),然后将 new Course 对象添加到 Transcript。
  • 请包括循环代码以及堆栈跟踪
  • 哇,读这段代码真的伤了我的脑筋

标签: java arrays class


【解决方案1】:

您需要为每门课程创建一个新的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);

【讨论】:

  • 谢谢大家,真的谢谢。但是,我想知道,使用那个 new 来创建一个新对象,会在 ram 或其他地方腾出更多空间吗?这是最好的方法(性能)还是最简单的方法?
  • @MuhammetArslan 除了为每门课程分配一个对象外,没有其他方法可以执行您所描述的操作。
【解决方案2】:

对象是Java中的引用,即指向对象的指针。所以当你这样做时:

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

您不是将整个对象a 复制到b,而是将a 的引用复制到b(内存地址)。所以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。现在courseturkcematematik 都引用了您首先使用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);

【讨论】:

  • 谢谢大家,真的谢谢。但是,我想知道,使用那个 new 来创建一个新对象,会在 ram 或其他地方腾出更多空间吗?这是最好的方法(性能)还是最简单的方法?
  • 不客气。这是学习 Java 时的常见错误。是的,它需要更多 RAM,如果可以的话,您应该避免使用 new。但是,在您的情况下,您无法避免创建一个新对象,因为您希望每次都存储不同的数据并保留它,因此添加的数据越多,您将使用的 RAM 越多,显然 :) 不用担心,计算机这几天可能需要更多的时间;)
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
相关资源
最近更新 更多