J'ai commencé un projet simple, mais j'ai rencontré un problème. Classe principale

public static void main(String[] args){

    /*
• Ask the user how many new students will be added to the database.
• The user should be prompted to enter a name and year for each student.
• The student should have a unique 5-digit id, with the first being their grade level.
• The student should have several course options to choose from.
• Each course costs $600 to enroll.
• The student should be able to check their balance and pay tuition.
• The status of the student should show their name, id, courses, and balance.
     */
    Scanner input = new Scanner(System.in);
    Scanner n = new Scanner(System.in);
    int numberOfStudents=0,year;
    String firstName,lastName;

    System.out.println("How many students will attend this School? ");
    //input number of students
    System.out.print("Input : ");
    numberOfStudents = input.nextInt();
    //end
    //Input name and year for every student
    Student  students [] = new Student[numberOfStudents];
    Deposit deposit [] = new Deposit[numberOfStudents];

    for(int i = 0 ; i < numberOfStudents ;i ++){
        students[i]=new Student();
        deposit[i]=new Deposit(students[i]);
        //It consumes the /n character
        input.nextLine();
        //
        System.out.print("Insert First name : ");
        firstName=input.nextLine();
        students[i].setFirstName(firstName);

        System.out.print("Insert last name : ");
        lastName=input.nextLine();
        students[i].setLastName(lastName);

        System.out.print("Input year :");
        year=input.nextInt();
        students[i].setYear(year);
        //set cash test
        students[i].setCash(1000);
        //end
    }
    for(int j = 0 ; j < numberOfStudents ; j++){
        System.out.println("Student " + j + " First name " + students[j].getFirstName() + " has " + deposit[j].getBalance());
    }

    //end


}

Classe étudiante

private String firstName,lastName;
private int year,grade,cash;
private int[] studentID = new int[5];

public Student(){

}

public Student(String firstName, String lastName, int year) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.year = year;
}

public Student(String firstName, String lastName, int year, int grade, int cash) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.year = year;
    this.grade = grade;
    this.cash=cash;
}

private int[] RandomID(){
    Random rand = new Random();
    this.studentID[0] = this.grade;
    for(int i = 1; i <= this.studentID.length-1 ; i ++ ){
        int randomNumbers = rand.nextInt(10);

        this.studentID[i] = randomNumbers;
    }
    return this.studentID;
}


public int[] getStudentID() {
    return RandomID();
}


public int getCash() {
    return cash;
}

public void setCash(int cash) {
    this.cash=cash;
}


public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public int getYear() {
    return year;
}

public void setYear(int year) {
    this.year = year;
}

public int getGrade() {
    return grade;
}

public void setGrade(int grade) {
    this.grade = grade;
}

Classe de dépôt:

private Student student;
private int balance;

public Deposit(){

}

public Deposit(Student student){
    this.student = student;
    this.balance=student.getCash();
}

public void checkBalance(){
    System.out.println("You have " + this.student.getCash() + " on this account");
}


public Student getStudent() {
    return student;
}

public void setStudent(Student student) {
    this.student = student;
}

public int getBalance() {
    return this.balance;
}

public void setBalance(int balance) {
    this.balance = balance;
}

Quand j'appelle Main System.out.println(deposit[j].getBalance());, il dit que c'est 0, mais je le mets dans le constructeur de la classe Deposit.

this.balance ne devrait-il pas avoir une valeur de student.getCash()? La méthode checkBalance en dépôt me donne la valeur dont j'ai besoin lorsque je l'appelle dans la classe principale student.getCash ().

-1
Admir Halilovic 30 août 2020 à 17:11

2 réponses

Meilleure réponse

Vous initialisez le Deposit avec une instance Student avant d'initialiser son cash, donc ce sera 0. Déplacez l'initialisation du Deposit une fois que vous avez terminé d'initialiser le Student correspondant et vous devriez être OK:

for(int i = 0 ; i < numberOfStudents ;i ++){
    students[i]=new Student();
    //It consumes the /n character
    input.nextLine();
    //
    System.out.print("Insert First name : ");
    firstName=input.nextLine();
    students[i].setFirstName(firstName);

    System.out.print("Insert last name : ");
    lastName=input.nextLine();
    students[i].setLastName(lastName);

    System.out.print("Input year :");
    year=input.nextInt();
    students[i].setYear(year);
    //set cash test
    students[i].setCash(1000);
    //end

    deposit[i]=new Deposit(students[i]);
}
1
Mureinik 30 août 2020 à 14:17

La valeur est définie au moment où vous créez un objet Deposit, c'est-à-dire immédiatement après la création d'un nouvel objet Student. À ce moment-là, la valeur de cash dans l'instance Student est zéro. Vous ne définissez cela que plus tard. Vous pouvez faire quelque chose comme:

public int getBalance() {
    return this.student.getCash();
}

Au lieu de définir un membre balance une fois, cela appellerait la méthode sur l'instance Student à chaque fois pour obtenir la valeur mise à jour. Je ne dis pas que c'est le meilleur design, mais cela semble être ce à quoi vous vous attendiez.

1
Dave 30 août 2020 à 14:19