我想知道做所有的局部变量变成静态的,如果我们在一个静态方法声明呢?
例如:
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是按值传递始终,但为什么X的状态已经改变了我们取得的changeX调用之后? 任何人都可以解释,请? 和任何人都可以解释如何做JAVA处理静态变量在内存分配方面? 如果我们通过一个静态变量的函数作为参数发生什么事(我知道人们通常不会做到这一点)
这个问题的答案大部分的问题是“像任何其他变量。”
在静态方法局部变量是在静态方法只是局部变量。 他们不是一成不变的,他们不是特别以任何方式。
静态变量在附连到相应的存储器中保存Class
对象; 通过静态引用变量引用的任何对象只是生活在常规堆。
当你通过一个静态变量的方法作为参数......绝对没有任何有意义的事件发生。
关于在代码中的场景:
- 试想一下,你有一个玩具气球上的绳子(气球是你的数组对象,字符串是参考它在声明
A()
- 现在你配合另一个字符串到气球和手该字符串的朋友(也就是当你调用正是发生
changeX()
方法:字符串是方法的参数,它指向同一个对象。) - 接着,您的朋友拉动串中,需要一个黑色标记,并绘制一个面在球囊(这就像
changeX()
方法改变数组)。 - 然后你的朋友解开他的字符串,留下固定在气球只是你的字符串(该方法返回,并在局部变量
changeX()
超出范围。) - 最后,你在字符串中卷轴,并期待在气球:当然,你看到他的脸(你的
A()
例行看到改变的阵列。)
它真的就这么简单!
正如其他人所指出的那样,这是当地的一种方法变量是相同的任何其他方法内声明的任何其他变量 - 它们是动态分配的,当该方法返回的变量不再可见可被释放。
但是,如果你需要静态变量,你必须声明它们的方法外,作为一类普通静态变量。 如果,按照惯例,你让他们独立除非特定的方法里面,他们有同样的效果,好像他们是静态的,局部的方法。 只是一定要添加注释这种效果。
静态变量存储在名为“永久代”堆的特殊区域。
在静态方法delcared局部变量不与那些在非静态方法中声明的任何差异。 对象引用和原始变量放置在stack.Whenever创建一个对象,被执行的代码时,存储在堆上分配。