13

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

例如:

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

4

3 回答 3

24

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

静态方法中的局部变量只是静态方法中的局部变量。它们不是静态的,也没有任何特殊之处。

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

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

关于代码中的场景:

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

真的就这么简单!

于 2012-05-18T02:18:22.800 回答
3

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

但是,如果您需要静态变量,则必须在方法之外将它们声明为类的普通静态变量。如果按照惯例,除非在该特定方法中,否则您不理会它们,则它们具有与静态和本地方法相同的效果。请务必为此添加评论。

于 2012-05-18T02:22:30.440 回答
1

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

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

于 2012-05-18T02:28:13.717 回答