Использование вами параметра 'n', как отмечено выше, является избыточным, но также имеет недостатки в вашем коде с n + 1 ?? Ваш код будет генерировать ArrayIndexoutOfBoundsException, если запустить что-то вроде:
String [][] m1 = { {"A", "B"}, {"C", "D" } };
String [][] m2 = copy(m1, 2);
Что, по-видимому, как вы намереваетесь вызвать?
Он также ограничивает вашу функцию квадратными «матрицами» строк.
Но что касается проблемы, которую вы указали, я не вижу причин, почему программа должна вести себя так ... Я даже запустил ее, используя приведенный выше вызов (но с n = 1 ???), затем изменил
m2[0][1] = "X";
и m1 не изменились, как и ожидалось.
Даже замена самой внутренней строки кода на:
out[i][j] = matrix[i][j];
не меняет этого, так как компилятор переписывает его на то, что вы изначально имели. На самом деле большая часть синтаксиса String является просто синтаксическим сахаром для StringBuffers (например, конкатенация и присваивание). например, компилятор перепишет
String s = "Hello ";
s += "World"; // Makes it appear that String is builtin type!
в
String s = new String("Hello ");
s = new StringBuffer(s).append("World").toString();
Именно поэтому у вас много конкатенаций строк внутри циклов, которые они могут выполнять очень плохо.
Я не понимаю, почему у вас возникла проблема, которую вы указали.
И поскольку вы не изменяете параметр 'matrix', 'Pass By Reference' не имеет к этому никакого отношения.