静态方法中的局部变量也是静态的吗?

我想知道如果我们在静态方法中声明它们,所有局部变量都会变成静态的吗?

例如:

  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总是通过值传递,但是为什么在我们进行changeX调用后X的状态发生了变化?任何人都可以解释一下吗?谁能解释一下Java在内存分配方面如何处理静态变量?如果我们将静态变量作为参数传递给函数会发生什么(我知道人们通常不会这样做)


答案 1

大多数问题的答案是“与任何其他变量相同”。

静态方法中的局部变量只是静态方法中的局部变量。它们不是静态的,它们在任何方面都不是特别的。

静态变量保存在附加到相应对象的内存中;静态引用变量引用的任何对象都位于常规堆中。Class

当您将静态变量作为参数传递给方法时...绝对没有有趣的事情发生。

关于代码中的方案:

  1. 想象一下,字符串上有一个玩具气球(气球是数组对象,字符串是在 中声明的对它的引用。A()
  2. 现在,您将另一个字符串绑在气球上,并将该字符串交给朋友(这正是调用该方法时发生的情况:字符串是该方法的参数,它指向同一对象。changeX()
  3. 接下来,你的朋友拉动绳子,拿一个黑色的记号笔,在气球上画一个脸(这就像修改数组的方法)。changeX()
  4. 然后你的朋友解开他的字符串,只留下你的字符串附加到气球(方法返回,并且中的局部变量超出范围。changeX()
  5. 最后,你卷起琴弦,看看气球:当然,你看到了脸(你的例行公事看到的是改变的数组)。A()

就这么简单!


答案 2

正如其他人所指出的,METHOD的局部变量与任何其他方法中声明的任何其他变量相同 - 它们是动态分配的,并且可以在方法返回变量不再可见时释放。

但是,如果需要静态变量,则必须将它们声明在方法外部,作为类的普通静态变量。如果按照惯例,除非它们位于该特定方法中,否则不用使用它们,则它们具有与静态和方法的局部相同的效果。只要确保添加注释即可。


推荐