2013-01-15 2 views
0

J'ai 3 classes: Course, CourseEntry et Transcript. Dans la transcription, j'ai une fonction pour ajouter des cours, comme ça:Tableau avec d'autres classes - objet - Java

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) 

Et dans mon CourseEntry:

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

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

Et dans mon 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; 
    } 

Dans mon principal:

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

Mais si je boucle le tableau coursestaken, il imprime le dernier index inséré pour tout.

Comment puis-je résoudre ce problème?

Merci

+5

'Course.addNewCourse' */mute changements/mises à jour * le courant objet (et ne "l'ajoute" à rien).Au lieu de cela, supprimez cette méthode et utilisez 'new Course' (le constructeur doit être mis à jour pour prendre courseNumber, credits, courseName), puis ajoutez l'objet * new * Course à la transcription. –

+0

s'il vous plaît inclure le code de boucle ainsi que la trace de la pile – amphibient

+0

wow lire ce code m'a vraiment fait mal au cerveau –

Répondre

3

Les objets sont références en Java, qui est, des pointeurs vers les objets. Alors, quand vous faites:

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

Vous n'êtes pas copier tout l'objet a-b, mais la copie la référence à a-b (l'adresse de la mémoire). Donc à la fois a et b sont des références à l'objet créé par new.

Suivons votre code afin que vous voyez ce qui se passe:

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

Ici vous avez modifié l'objet course. matematik est maintenant le même que course car il pointe vers le même objet.

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

Ici, vous modifiez à nouveau course. Maintenant, course, turkce et matematik font tous référence au même objet que vous avez créé en premier avec Course course = new Course();.

Je pense que moyen le plus facile de résoudre ce problème est que vous créez un constructeur avec des paramètres:

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

puis

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

    Course turkce = new Course(1, 4, "Türkçe"); 
    t.addCourse(turkce); 
+0

Merci pour tout, merci beaucoup. Mais, je me demande que, avec l'utilisation de cette nouvelle afin de créer un nouvel objet, va faire de l'espace plus sur RAM ou ailleurs? C'est la meilleure façon (pour la performance) ou le moyen le plus facile? –

+0

De rien. C'est une erreur courante lors de l'apprentissage de Java. Oui, il faut plus de RAM et vous devriez éviter de faire du «nouveau» si vous le pouvez. Dans votre cas, cependant, vous ne pouvez pas éviter de créer un nouvel objet car vous voulez stocker des données différentes à chaque fois et les conserver, donc plus vous ajoutez de données, plus vous utiliserez de RAM, évidemment :) Et ne vous inquiétez pas, les ordinateurs ce jour peut prendre beaucoup plus que cela;) – m0skit0

+0

Merci pour tout :) –

7

Vous devez créer un nouvel objet Course pour chaque cours, votre méthode addNewCourse mute seulement l'objet Course courant. Modifier Course comme ceci:

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

Et puis utilisez ce qui suit:

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

Merci pour tout, vraiment merci. Mais, je me demande que, avec l'utilisation de cette nouvelle afin de créer un nouvel objet, va faire de l'espace plus sur RAM ou ailleurs? C'est la meilleure façon (pour la performance) ou le moyen le plus facile? –

+0

@MuhammetArslan Il n'y a pas d'autre moyen de faire ce que vous décrivez, sauf pour allouer un objet par cours. –