Как работает в 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 шт):

Автор решения: Igor

почему так происходит

Потому что macierz2 = macierz присваивает ссылку на тот же объект. Вам придется написать код (класс/метод), который создает новую матрицу и копирует туда значения.

→ Ссылка
Автор решения: Wlad

Есть 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;

это будет означать, что мы первой переменной в качестве значения присвоили копию адреса (значение битов адреса) на второй объект, и теперь обе переменные ссылаются на второй объект (иначе говоря, два пульта от одного и того же телевизора).

→ Ссылка