Java int二维数组值的变化

下面这段程序,为什么再次输出a的值的时候,已经变成了c的值了?有点诡异

public class Test {
public final int TYPE_ADD = 1;

/**
 * 矩阵类,实现n阶矩阵的加、乘、转置运算
 * 
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    int[][] a = { { 1, 2 }, { 2, 3 } };
    int[][] b = { { 4, 5 }, { 6, 7 } };
    Test m = new Test();

    System.out.println("输出原始矩阵a:");
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < a[i].length; j++) {
            System.out.print(a[i][j] + "\t");
        }
        System.out.println();
    }

    System.out.println("两矩阵相加:");
    int[][] r = m.matrix_add(a, b);
    for (int i = 0; i < r.length; i++) {
        for (int j = 0; j < r[i].length; j++) {
            System.out.print(r[i][j] + "\t");
        }
        System.out.println();
    }

    System.out.println("再次输出原始矩阵a:");
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < a[i].length; j++) {
            System.out.print(a[i][j] + "\t");
        }
        System.out.println();
    }
}

// 矩阵相加
public int[][] matrix_add(int[][] a, int[][] b) {
    int[][] c = a;
    if (inputLegal(a, b, TYPE_ADD)) {// 只有同型矩阵才能相加
        for (int i = 0; i < a.length; i++) {// i控制行
            for (int j = 0; j < a[i].length; j++) {// j控制列
                c[i][j] = a[i][j] + b[i][j];
            }
        }
    }
    return c;
}

// 矩阵类型校验
public boolean inputLegal(int[][] a, int[][] b, int type) {
    boolean flag = true;
    if (type == TYPE_ADD) {
        if (a.length != b.length || a[0].length != b[0].length) {
            flag = false;// 判断是否为同型矩阵
        }
    }
    return flag;
}

}


matrix_add中有这句话不行int[][] c = a
这样c就指向了a,他俩是同一个内容,数组是引用类型,修改c就是在修改a

你应该copy一份a的副本,然后在操作

楼上分析正确,我补充一下。int[][] c = a; 换成 int[][] c = a.clone(); 这样 c 和 a就不是同一个指向了。

int[][] c = new int[a.length][a[0].length];应该这样定义可能要好点。

int[][] c = new int[a.length][a[0].length];应该这样定义可能要好点。