public static void distributeBatteries(Robot[] robots) {
int j = 0;
for (Robot robot : robots) {
while (robot.getCharge() < 20) {
robot.replaceBattery(batteryWarehouse[j++]);
}
}
}
Скиталец
38 уровень
Поясните пожалуйста детально, каким образом в этом методе меняется сам элемент массива?
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Денис Enterprise Java Developer
9 июля 2023, 08:12
В цикле ты перебираешь роботов, и у каждого вызываешь метод replaceBattery до тех пор пока getCharge не будет возвращать 20, согласен?
Вот и смотри как работает метод replaceBattery, скорее всего он меняет какие-то переменные у объекта который его вызвал, почти наверняка в этом участвуют и значения из массива batteryWarehouse, элемент которого передаётся в качестве аргумента.
А в целом, задавая вопрос по коду, приводи весь код целиком, чтобы людям не приходилось гадать на кофейной гуще.
0
Скиталец
9 июля 2023, 13:18
Код целиком отправить нельзя - это правильное решение, а здесь запрещено это делать. Но его можно посмотреть в самой задаче.
0
Anonymous #3303140
9 июля 2023, 16:18
В этом цикле for ты перебираешь массив роботов, и каждому разряженному заменяешь батарею.
Индекс массива батарей j увеличивается из-за оператора инкремента при каждом обращении к нему. То есть в процессе замены батареи у робота ты автоматически переходишь к селдующей батарее из-за j++, и когда будешь менять батарею другому роботу значение j уже будет увеличено на 1
0
Скиталец
9 июля 2023, 18:24
Разве все что ты сейчас описал не меняет значение лишь итерационной переменной robot? Почему меняются сами элементы массива? Если к примеру я напишу такой код:
for (int x : ints) {
x++;
}
...то все значения в массиве ints останутся прежними, а не увеличатся на единицу. Так почему в коде решения задачи элементы массива robots изменяются?
0
Anonymous #3303140
10 июля 2023, 04:48
Потому что ints - это массив примитивов, и твой код аналогичен следующему:
Сначала ты записываешь значение из ints[i] во временную переменную x. С этого момента они начинают хранить одинаковые значения. Затем ты увеличиваешь значение временной переменной икс. Это никак не отражается на значении, хранимом в массиве. А дальше начинается новая итерация, переменная икс создаётся заново, потому что её область видимости ограничена телом цикла. Это значит, что она существует только в рамках каждой отдельно взятой итерации цикла. Ну а значения массива ты так и не изменяешь.
Со ссылочными переменными получается по-другому. Заменим в этом примере числа роботами. Что произойдёт после команды Принцип тот же самый: значение из переменной справа записывается во временную переменную слева. Только что является значением ссылочной переменной? Вспоминаем лекции. Ссылочный переменная хранит не сам объект, а ссылку на адрес в памяти, которая этот объект содержит. Получается, что операция присваивания помещает эту же самую ссылку во вторую переменную, и обе переменные начинают ссылаться на один и тот же объект. Через какую из них ты не обратишься к этому объекту, все изменения будут происходить с самим объектом и отражаться через любую из имеющихся переменных, хоть через временную, хоть через элемент массива. Переменная - это просто фасад, интерфейс, через который можно обратиться к объекту. +1
Скиталец
10 июля 2023, 08:44
Значит, все зависит от того какой у нас тип данных: примитивный или ссылочный. Огромное спасибо!
0