java的static相关问题,希望大佬解答一下

今天用static修饰一个二维数组做矩阵相乘,是这样写的,但是后来发现当我第二次运算的时候,把第一次运算的结果也改变了,static为什么会这样?

//矩阵乘法
static long[][] l=new long[2][2];
public static long[][] Matrix(long[][] a,long[][] b){

    System.out.println("lkkk");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 2; k++) {
                l[i][j]+=a[i][k]*b[k][j];
            }
        }
    }
return l;
}

3个回答

静态变量,有缓存的作用,因为说到底,最低层值变动了

你再for循环里使用+=,第二次运算不就是会在相应数组位置中进行数据相加操作吗,肯定值会改变,这不是字符串,数值类型会进行相加操作。
补充:加了static关键字的数组不依赖于任何特定的对象实例,且同一个静态变量只占一份存储空间,无论创建几次对象都会共享这个静态变量的值。你的Matrix()方法中是对static long[][] l=new long[2][2];数组进行值的操作,不管你调用几次都是在对方法上面声明的数组进行值的操作,方法返回的数值也是static long[][] l=new long[2][2];数组的值的副本,因此你第二个方法执行完毕后第一次执行所拿到的值也会改变,如果不想每次执行完就改变就把数组的static去掉,并把对象的创建放在方法中就可以了。

weixin_44700117
-zyfjava- 回复chenzonghang: 我的回答做了补充,你看一下上面
2 个月之前 回复
chenzonghang
chenzonghang 你好,是这样的。 我先用函数计算了long[][] p = {{1,1},{1,1}}; long[][] u =Matrix(p, p);然后我再执行long[][] k =Matrix(p, p);当我第一次计算u个计算完k的u,输出不一样了
2 个月之前 回复

肯定的了,static表示这个对象一直存在,你改来改去还是他自己,取的值当然一样。
删掉直接在方法里new一个就行了

问答版主就是牛,从现在起只回论坛,不在踏入问答半步

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问