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

时间:2012-05-18 02:16:46

标签: java memory-management static static-methods

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

例如:

  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如何在内存分配方面处理静态变量?如果我们将静态变量作为参数传递给函数会发生什么(我知道人们通常不会这样做)

3 个答案:

答案 0 :(得分:22)

您的大部分问题的答案都是“与任何其他变量相同。”

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

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

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

关于代码中的方案:

  1. 想象一下,你在一个字符串上有一个玩具气球(气球是你的数组对象,字符串是A()中声明的对它的引用。)
  2. 现在你将另一个字符串绑定到气球上​​并将该字符串交给朋友(这正是调用changeX()方法时发生的情况:字符串是方法的参数,它指向同一个对象。)
  3. 接下来,你的朋友拉入字符串,拿一个黑色标记并在气球上绘制一个面(这就像修改数组的changeX()方法一样)。
  4. 然后你的朋友解开他的字符串,只留下你的字符串附加到气球上(方法返回,changeX()中的局部变量超出范围。)
  5. 最后你卷入字符串然后看气球:当然,你看到了脸(你的A()例程看到了变化的数组。)
  6. 这真的很简单!

答案 1 :(得分:2)

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

但是,如果需要静态变量,则必须在方法之外声明它们,作为类的普通静态变量。按照惯例,如果除了在特定方法内部之外,它们将它们留下,它们具有与方法静态和局部相同的效果。请务必为此添加评论。

答案 2 :(得分:1)

静态变量存储在堆的特殊区域,称为“永久代”。

静态方法中的局部变量与非静态方法中声明的局部变量没有任何区别。对象引用和原始变量放在堆栈上。无论何时创建对象,都会在执行该代码时在堆上分配存储。