【问题标题】:Are local variables in static methods also static?静态方法中的局部变量也是静态的吗?
【发布时间】:2012-05-25 15:09:29
【问题描述】:

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

例如:

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

【问题讨论】:

  • 这没有意义,因为静态对局部变量没有意义。它们是本地的,周期的,无论是在静态方法还是实例方法中。
  • 它是一个局部或临时变量。函数结束后,就没有作用域了。
  • 数组是java中的一个对象。数组的引用在调用时会传递给changeX,所以它在数组中的元素可以在changeX内改变。
  • 您在这里混淆了大约五个不同的概念。

标签: java memory-management static static-methods


【解决方案1】:

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

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

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

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

关于代码中的场景:

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

就这么简单!

【讨论】:

  • 你能解释一下为什么X的状态在那个函数调用之后发生了变化吗?
  • @user1389813:这与 static 无关,与理解引用变量有关。请阅读 java-ranch 对变量的看法。
  • 但我认为 java 总是按值传递
  • 是传值,但是对于引用变量,值就是引用本身。
  • @user1389813 -- 我在答案的末尾添加了一个部分来解释您的代码行为。它实际上非常简单——不要过度分析它。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-02
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2011-01-17
      • 2011-05-30
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多