В Java все передается по значению - но это значение всегда является либо примитивом, либо ссылкой.
Таким образом, значение любой переменной массива является ссылкой на массивобъект.Когда вы используете эту переменную в качестве аргумента, значение (ссылка) заканчивается как начальное значение параметра.Он по-прежнему ссылается на тот же массив объект , что и переменная вызывающего - поэтому любые изменения, внесенные в массив, будут видны вызывающим.
Так что просто для пояснения, ваше утверждение здесь неверно:
досадно, что, похоже, обновляет переменную, которую вы ей даете, когда она не должна
Она не изменила значение переменной вообще: эта переменная в вызывающем коде все еще имеет то же значение, что и раньше, ссылку на тот же массив.Просто метод изменяет содержимое массива.
Это похоже на то, как ты копируешь свой адрес на листе бумаги, а потом отдаешь это кому-то: они не могут изменить то, где ты живешь, но они могут изменитьсяцвет вашей входной двери.
Теперь, чтобы решить вашу проблему ...
Если вы хотите клонировать массив, вам придется сделать это явно.Например:
public static Double[] smallChange(Double[] sol) {
Double[] ret = (Double[]) sol.clone();
// Now work on ret instead of sol, and return ret at the end
Вы могли бы переназначить на sol
, но лично я бы не стал.
Обратите внимание, что вы также можете использовать double[]
вместо Double[]
.