黑马程序员技术交流社区
标题:
为什么在方法中将一个变量的值改变了,输出的时候变量的值还是没有改变
[打印本页]
作者:
李永科
时间:
2013-3-5 21:16
标题:
为什么在方法中将一个变量的值改变了,输出的时候变量的值还是没有改变
class Test
{
public static void main(String[] agrs)
{
int i=1;
show(i);
System.out.println(i);
}
public static void show(int i)
{
return i=2;
}
}
作者:
莫道荣
时间:
2013-3-5 21:50
首先int是值类型,main方法里面的i和show方法里面的i是两个完全不相干的变量,当在mian方法里调用show(i)的时候只是把i里面的值复制一份传递到show方法里,在show方法里又声明了一个变量i来接收刚刚传过来的值,而这个i是show方法里的局部变量,当执行完show方法就是两个{}括号之后这个i就会被回收掉,而mian方法里面的i的值还是1,没有改变过,所以你打印出来的还是1. 其实值类型的传递就好像你复制了两个文件,这两个文件毫无关系,而引用类型的传递就是复制快捷方式
作者:
李光耀
时间:
2013-3-5 22:09
public static void main(String[] args) {
int i = 1;
//有返回值需要用东西接受,因为方法是修改i的值,可以用i接受修改后的值,这样就可以把i修改成2
i = show(i);
System.out.println(i);
}
public static int show(int i) {
return i=2; //如果你要返回int值,方法类型不能用void,应该用int。
}
复制代码
作者:
HM王琦
时间:
2013-3-5 22:15
show方法的返回值类型写的有问题,void 类型的方法不能有返回语句。打印结果是1因为,你的main方法中的i,和show方法中的i,是两个局部变量。完全不相干。
作者:
邹学良
时间:
2013-3-5 22:42
在I调用show方法后,返回值I赋值为I=2
作为一个局部变量存在,被分配于内存的栈中,而当没有栈中的引用变量对其进行引用的时候,也就是SHOW方法执行结束后,I=2这个变量将会变成垃圾被JAVA中的垃圾回收器释放掉.而这个时候I的指向是重新赋予原来的值1 (i=1)
所以当执行到System.out.println(i)时,打印的是SHOW方法释放后的赋值
作者:
明锦添
时间:
2013-3-5 22:55
本帖最后由 明锦添 于 2013-3-5 22:59 编辑
在java中有两种引用,一种是值引用,一种是地址值引用。
通常基本类型的变量的引用是值引用,对象的引用都是地址值引用。
上文中的
i
是基本类型,是值引用,方法
show(int i)
中的
i
引用的值实际上只是前文定义的
i
的副本,
虽然在方法中对
i
进行了重新赋值,只改变了
i
的副本的值,并没有改变原本
i
的变量的值。
作者:
克零岚
时间:
2013-3-5 23:47
你的代码有错的。
如下,请看:
这是你的代码
class Test
{
public static void main(String[] agrs)
{
int i=1; //i是方法内部的局部变量,作用范围只在main方法中,传值给别的方法后,在其他的方法中变量的改变不会反映到原方法里的变量
show(i);
System.out.println(i); //输出的还是原来i的值,1.
}
public static void show(int i) //show()方法既然有return,就是有返回值,但你却用的void,ok!
{
return i=2;
}
}
修改后,正确的代码:
class Test
{
public static void main(String[] agrs)
{
int i=1;
int i2=show(i); //若把show(i)赋值再给i,即i=show(i),则System.out.println(i);输出为2
System.out.println(i); //输出为1
System.out.println(i2); //输出为2
}
public static int show(int i)
{
return i=2;
}
}
作者:
scott0610
时间:
2013-3-11 11:37
这是因为值传参的问题。
所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本事不会受到任何影响。【Java里的参数传递类似与《西游记》里的孙悟空,孙悟空复制了一个假孙悟空,这个假孙悟空具有和孙悟空同样的能力,可以降妖除魔。但不管这个假孙悟空遇到什么事,真孙悟空不会受到任何影响。呵呵这里打了一个简单的比方】。
作者:
HM李帅
时间:
2013-3-11 11:54
i是局部变量
而且不是int类型在内存中不是以引用-对象的形势存在的
只是一个值
你改变的只是show里面的i
而main方法里的i并没有变化
所以输出结果也没有变化
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2