Java. Почему изменяется переменная класса? Не могу понять, почему изменяется переменная класса, хотя в сортировке она не участвует вовсе. Нужно объяснение именно на этом примере, т.к. переписать так, что бы работало я могу.package cesar; import java.io.PrintStream; import java.util.Scanner; public class Cesar { private static Scanner sc = new Scanner(System.in); private static PrintStream pr = new PrintStream(System.out); private static char[] alphabet; private static char[] revAlphabet; static { alphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ".toLowerCase().toCharArray(); revAlphabet = getReverseAlphabet(); } public static void main(String[] args) {
} private static char[] getReverseAlphabet() { int step = 3; char[] rev = alphabet; for (char c : alphabet) //test 1 { pr.print(c); } pr.println(); for (int i = 0; i < step; i++) { for (int k = 0; k < rev.length-1; k++) { char temp = rev[k]; rev[k] = rev[k+1]; rev[k+1] = temp; } } for (char c : alphabet) //test 2 { pr.print(c); } return rev; } }
Проблема здесь заключается в том, что вы в методе getReverseAlphabet() работаете с переменной rev, которая ссылается на тот же массив, что и переменная alphabet, так как вы присвоили rev = alphabet. Это означает, что при изменении rev вы также изменяете alphabet, потому что обе переменные ссылаются на один и тот же объект в памяти.
Для того чтобы избежать этой проблемы, вам нужно создать отдельный массив для переменной rev, вместо того чтобы просто присваивать rev = alphabet. Вы можете сделать это, например, с помощью метода clone():
private static char[] getReverseAlphabet() { int step = 3; char[] rev = alphabet.clone(); // ваш код дальше }
Таким образом, вы создадите копию массива alphabet и будете работать с отдельным массивом rev, не изменяя при этом значения оригинального массива alphabet.
Проблема здесь заключается в том, что вы в методе getReverseAlphabet() работаете с переменной rev, которая ссылается на тот же массив, что и переменная alphabet, так как вы присвоили rev = alphabet. Это означает, что при изменении rev вы также изменяете alphabet, потому что обе переменные ссылаются на один и тот же объект в памяти.
Для того чтобы избежать этой проблемы, вам нужно создать отдельный массив для переменной rev, вместо того чтобы просто присваивать rev = alphabet. Вы можете сделать это, например, с помощью метода clone():
private static char[] getReverseAlphabet() {int step = 3;
char[] rev = alphabet.clone();
// ваш код дальше
}
Таким образом, вы создадите копию массива alphabet и будете работать с отдельным массивом rev, не изменяя при этом значения оригинального массива alphabet.