2015-03-13 2 views
-1

Хорошо, поэтому я выполняю упражнение, когда у меня есть объект, содержащий оценки для 3-х тестов.Функция сеттера с аргументами

Тогда у меня есть функция set, которая принимает 2 аргумента, номер теста и счет, который вы ему установили.

В настоящее время моя проблема заключается в том, что я не знаю, как заставить аргумент тестового номера работать правильно.

Код работает, если я делаю test1 = score, но когда я установил student1.test1 в заданный аргумент, по какой-то причине он не регистрируется.

Надеюсь, вы можете указать мне в правильном направлении, я был бы очень благодарен!

У меня есть основной класс и класс ученика:

public class Main { 
    public static void main(String[] args) { 
     Student student1 = new Student(); 
     student1.setTestScore(student1.test1, 50); 
     System.out.print(student1.test1); 
    } 
} 

public class Student { 
    int test1; 
    int test2 = 0; 
    int test3; 

    Student() { 
     int test1 = 0; 
     int test2 = 0; 
     int test3 = 0;  
    } 

    public void setTestScore(int testNumber, int score){ 
     testNumber = score; 
    } 
} 
+0

Вы бы быть намного лучше, если 'test' отдельный класс. – Andrew

+0

Я бы предложил вам сделать ints в классе ученика частным и в вашем конструкторе, вы объявляете свои переменные. –

+1

Основная идея неправильная. вы не изменяете такое значение. – HuStmpHrrr

ответ

3

Java является пропуском на языке значение, поэтому, когда вы передаете student1.test1 к student1.setTestScore, вы передаете копию этого члена. Вы не передаете ссылку на участника. Поэтому метод не может изменить значение элемента.

Даже если язык допускает такую ​​модификацию, это было бы плохой идеей с точки зрения объектно-ориентированного программирования, поскольку вы обычно делаете членов закрытыми и не обращаетесь к ним непосредственно извне класса.

Возможной альтернативой является использование массива:

public class Student { 
    int[] test = new int[3]; 
    ... 

    public void setTestScore(int testNumber, int score){ 
     if (testNumber >= 0 && testNumber < test.length) 
      test[testNumber]=score; 
    } 
    ... 
} 

и вы бы вызвать метод как это:

student1.setTestScore(0, 50); // note that valid test numbers would be 0,1 and 2 
+0

@BoristheSpider Да, я просто добавил пример, который иллюстрирует это. – Eran

+0

В этом случае имеет значение вопрос о передаче по значению, поскольку значение, переданное методу, является примитивным, а не ссылкой на объект? – CKing

+0

@bot Другие языки, такие как C и C++, позволяют передавать ссылку на любую переменную, поэтому я предполагаю, что это является причиной ошибки OP – Eran

Смежные вопросы