我想知道如果我们以静态方法声明它们,所有局部变量都将变为静态的?
例如:
public static void A(){ int x [] = {3,2}; changeX(x); for (int i = 0; i< x.length; i++){ System.out.println(x[i]); // this will print -1 and 1 } } private static void changeX(int[] x){ x[0] = -1; x[1] = 1; }
据我所知,Java总是通过值传递,但是为什么X的状态在进行changeX调用后发生了变化?有人可以解释一下吗任何人都可以解释Java如何处理内存分配方面的静态变量?如果我们将一个静态变量作为一个参数传递给函数会发生什么(我知道人们通常不会这么做)
解决方法
大多数问题的答案是“与任何其他变量相同”.
静态方法中的局部变量只是静态方法中的局部变量.它们不是静态的,它们不是特别的.
静态变量保存在与对应的Class对象相连的内存中;静态引用变量引用的任何对象都只能存在于常规堆中.
当一个静态变量传递给一个方法作为参数时,绝对没有任何有趣的事情发生.
关于你的代码中的情况:
>想象一下,你在一个字符串上有一个玩具气球(气球是你的数组对象,字符串是在A()中声明的字符串的引用)
>现在你将另一个字符串绑定到气球,并将该字符串交给一个朋友(正是当你调用changeX()方法时会发生什么:字符串是方法的参数,并且它指向同一个对象.
>接下来,你的朋友拉入字符串,拿一个黑色的标记,并在气球上画一张脸(这就像修改数组的changeX()方法).
>然后你的朋友不了解他的字符串,只是将你的字符串附加到气球(该方法返回,并且changeX()中的局部变量超出范围.)
>最后你卷起字符串并看着气球:当然,你看到脸(你的A()例程看到改变的数组.)
真的很简单!