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,求解释?
public static void show(int x)
{
x = 2;
}
此函数没有返回值,也就是说show方法中的参数x的影响范围仅在show方法之中
int x = 4;
show(x);//调用时,参数x仅在此句产生作用,而x=2;不能改变参数x的值
如果给show返回值,则可以改变
public static int show(int x)
{
return x = 2;
}
接收返回值x = show(x);
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。
<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。如果这个方法接收的值的类型为引用传递时,将地址传递给了方法,修改的是同一个位置(即同一个值),比如数组,那么它的值会发生改变,例如:
这样写的话,值就会发生改变。如果还不明白的话,继续讨论