作者: 潘金锋 时间: 2014-2-10 20:57
class Demo
{
public static void main(String[] args)
{
int x = 4;
show(x);
System.out.println(x);
}
public static void show(int x)
{
x = 2;
}
}
为什么输出值是4,不是2,求解释?main方法中调用show(x),值传递(即复制一份)4到形参x,main方法中的x值依然为4(原始值)
在show方法中(复制版本)x被赋值为2
show方法结束,局部变量(复制版本)x从栈中消失
执行到main方法打印x,输出结果4
结论:show方法局部变量x的变量作用域仅在其方法体内,随着该方法执行结束,局部变量x消失 作者: 袁梦希 时间: 2014-2-10 21:25
楼下回答的很详细了 不错作者: 奋斗的小胖子 时间: 2014-2-11 09:41
因为在你那个show方法里面,没有输出也没有返回,所以主函数就是输出以前的。作者: skyname 时间: 2014-2-11 12:39
class Demo
{
public static void main(String[] args)
{
int x = 4;
show(x);
System.out.println(x);
}
public static void show(int x)
{
x = 2;
}
}为什么输出值是4,不是2,求解释?
首先,x在main函数中定义的,是全局变量,而且存在于堆内存中。在show方法中,定义了一个局部
变量x并将其赋值为2,存在于栈内存中。调用show方法,只是将main方法中x的副本(复制一份)传递给了show方法。
show方法一结束,栈内存中的x就消失了,对main函数中定义的x没有半点影响。所以最终返回的就是4。 作者: 李金中 时间: 2014-2-11 13:35
这个在C++中很好理解,因为可以从指针的角度去分析。比如:
主函数中的x的地址假设是p1, *p1 就是p1指向的内容,即x;
当你调用函数把x传进去操作时,实际上是重新开辟了一个地址空间,比如p2, 只是*p2即p2指向的值是x;
当你对函数内的x操作时,实际上操作的事*p2,而非主函数内的*p1;两个x只是值相同,而不是同一个地址上的,可以想象成只是两个相同的东西罢了。你把弄坏了,另一个是不变化的。
所以 你在函数内的操作,是不影响主函数的x的。。。
明白了么 作者: 李金中 时间: 2014-2-11 13:36
我觉得虽然JAVA 屏蔽了指针,但是道理应该是一样的作者: dongdong5982 时间: 2014-2-11 14:33
<div class="blockcode"><blockquote>public class Test {
public static void main(String[] args) {
int[] arr = {4};
show(arr);
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void show(int arr[]) {
arr[0] = 2;
}
}
复制代码
public static void main(String[] args)
{
int x = 4;
show(x);
System.out.println(x);
}
public static void show(int x)
{
x = 2;
}关于这个问题要首先弄明白什么是值传递、什么是引用传递。那些基础数据类型在方法间进行传递时,只是将这个值的一个副本传给了方法,当这个副本的值发生改变时,不会影响到原来的值。所以在这里打印出来的还是4,不是2。如果这个方法接收的值的类型为引用传递时,将地址传递给了方法,修改的是同一个位置(即同一个值),比如数组,那么它的值会发生改变,例如:
这样写的话,值就会发生改变。如果还不明白的话,继续讨论