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

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

最佳答案

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

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

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

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

关于您代码中的场景:

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

就这么简单!

关于java - 静态方法中的局部变量也是静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645914/

相关文章:

java - 从 Eclipse 中的工作应用程序导出后出现 ClassNotFoundException

javascript - 通常只执行一次 javascript 的有效方法(通过 cookie)?

node.js - NodeJS : Can a static method call the constructor of the same class?

按下主页按钮时的 iOS 应用程序 dealloc

C 内存分配器和严格的别名

c# - C#中的 "default"序列化是否序列化静态字段?

java - 如何使用方法 super() 传输有界参数

java - 如何使用thrift生成器作为maven依赖(如何避免引用.exe文件)?

java - Drools-如何找出匹配的所有规则?

c - 如何在函数内初始化和分配 char** 参数