Как работает в Java копирование переменных
Всем привет,у меня есть код где я создаю две матрицы 3х3, потом первую из них я заполняю рандомными
числами а второй пишу macierz2 = macierz. Я делаю это для того, что бы когда я отсортирую
строки в первой матрице, то у меня была еще вторая, точно такая же, только строки у нее не отсортированные.
Но потом когда я в методе wypiszWierszy() пытаюсь вывести нужные мне строки с двумерного массива
macierz2 которые по идее должны быть не сортированные, то программа выводит мне отсортированные
строки. Может кто то знает почему так происходит? Буду рад за помощь!
package com.company;
import java.util.Arrays;
public class Macierz {
private int n;
private int m;
private int[][] macierz;
private int[][] macierz2;
private int max = 0;
private int min = 0;
public Macierz(int n, int m) {
macierz = new int[n][m];
}
public int random (int max, int min) {
this.max = max;
this.min = min;
max -= min;
return (int) (Math.random() * max) + min;
}
public void wypelnij () {
for (int i = 0; i < macierz.length; i++) {
for (int j = 0; j < macierz[i].length; j++) {
macierz[i][j] = random(-1, 1);
}
}
}
public void wypisz() {
for (int i = 0; i < macierz.length; i++) {
for (int j = 0; j < macierz[i].length; j++) {
System.out.print(macierz[i][j] + "\t");
}
System.out.print("\n");
}
}
public void wypiszWierszy () {
macierz2 = macierz;
int b;
for (int i = 0; i < macierz.length; i++) {
for (int j = 0; j < macierz.length; j++) {
for (int k = j + 1; k < macierz.length; k++) {
if (macierz[i][j] > macierz[i][k]) {
b = macierz[i][j];
macierz[i][j] = macierz[i][k];
macierz[i][k] = b;
}
}
}
}
for (int i = 0; i < macierz.length; i++) {
for (int j = i + 1; j < macierz[i].length; j++) {
if (Arrays.equals(macierz[i], macierz[j])) {
System.out.println((i + 1) + " = " + (j + 1));
for (int ii = i; ii <= i; ii++) {
for (int jj = 0; jj < macierz[ii].length; jj++) {
System.out.print(macierz2[ii][jj] + "\t");
}
System.out.print("\n");
}
for (int ii = j; ii <= j; ii++) {
for (int jj = 0; jj < macierz[ii].length; jj++) {
System.out.print(macierz2[ii][jj] + "\t");
}
System.out.print("\n");
}
}
}
}
}
}
package com.company;
public class Main {
public static void main(String[] args) {
Macierz macierz = new Macierz(3, 3);
macierz.wypelnij();
System.out.print("Losowo wypelniona macierz: \n");
macierz.wypisz();
System.out.print("Wierszy krore sa anagramami (wypisuje posortowane wierszy): \n");
macierz.wypiszWierszy();
}
}
Ответы (2 шт):
почему так происходит
Потому что macierz2 = macierz присваивает ссылку на тот же объект. Вам придется написать код (класс/метод), который создает новую матрицу и копирует туда значения.
Есть 2 типа данных:
примитивный: int, double, string (вроде бы!)
и
ссылочный: объекты классов, массивы и тд
приравнивая один ссылочный тип данных к другому вы НЕ СОЗДАЕТЕ новый объект. вы создаете новую переменную, которая хранить ПУТЬ к настоящему объекту.
объясняю я своими словами плохо, поэтому воть
https://javarush.ru/groups/posts/2642-ssihlochnihe-tipih-dannihkh-v-java
или гуглите в сторону "java примитивные и ссылочные типы данных"
UPD
Допустим, у нас есть две переменные ссылочного типа и объекты, на которые они ссылаются:
TV firstTV = new TV();
TV secondTV = new TV();
Если мы напишем:
firstTV = secondTV;
это будет означать, что мы первой переменной в качестве значения присвоили копию адреса (значение битов адреса) на второй объект, и теперь обе переменные ссылаются на второй объект (иначе говоря, два пульта от одного и того же телевизора).