黑马程序员技术交流社区
标题:
一个小问题求解
[打印本页]
作者:
heheka123
时间:
2014-4-10 17:42
标题:
一个小问题求解
public class Test{
public static void add3(Integer i){
int var=i.intValue();
var=var+2;
i=new Integer(var);
}
public static void main(String args[]){
Integer i=new Integer(0);
add3(i);
System.out.println(i.intValue());
}
}
复制代码
为什么结果不是2呢?怎么是0呢?求解 !!
作者:
你为谁归来
时间:
2014-4-10 17:56
add3函数没有返回值,也就是主函数里面的I和add3函数里面的I不是一个。分别是2个局部变量。所以在主函数输出的I实际上没有数值,默认为0.
作者:
赵小豪
时间:
2014-4-10 18:13
本帖最后由 赵小豪 于 2014-4-10 18:19 编辑
int类型是基本类型,所以它用于传值属于值传递,它的作用域只在main主函数中有效,所以不发生改变。如果用数组则是引用传递,引用传递是地址则会发生改变。
20140410181844554.jpg
(122.7 KB, 下载次数: 9)
下载附件
2014-4-10 18:19 上传
作者:
小歪
时间:
2014-4-10 20:40
首先你要分清楚主函数与你的自定义函数中的 i 是两个不同作用范围,他们的内存地址是完全不同,由于你的add3()函数是没有返回值的,所以此函数中对 i 的操作之作用在函数本身中,而主函数中的 i 一直是保持着传递参数前的值,固然是 0。
作者:
山治0712
时间:
2014-4-10 23:09
这个只能意会,真的,main中的i变量肯定是main中的,不会是add方法中的,add中的代码执行完没有对main中的数据产生任何影响,不管add方法中的变量叫什么名字
作者:
TTc
时间:
2014-4-11 00:24
你的变量是定义在main()方法中的,当你在调用add3的方法时将变量作为参数传递到add3()方法中,这时会将你的add3方法存到内存中的临时空间并执行,add3方法执行到末尾时,因为add3()方法返回值的类型为void,方法中没有返回值接着这个方法就被从临时的内存空间中释放了,,在main()方法中输出的变量就没能被方法add3改变;那这个变量i就叫做局部变量。
作者:
也许依然
时间:
2014-4-11 12:49
变量的作用域问题,在主函数中定义了变量 i ,指向创建的对象 new Integer(0),将其传入add3方法中,系统会为add3()开辟一块内存空间,函数中定义了另外的变量var和i指向同一个对象,操作完成后,但由于函数没有返回值,函数的生存期结束后内存会被释放,函数从断点处继续指向,引用变量的值还是原来分配的内存地址,所以结果为0
作者:
王春蕾
时间:
2014-4-11 16:15
楼主你好:lol
你在Test类的最后为什么要写i=new Integer(var)呢?是强转的意思吗?
使用new 就是再一次实例化一个Integer对象,而且Integer对象的默认值初始化值是0,所以楼主代码的运行结果必须是0啊
要想得到结果是2的话就把new关键字去掉,我感觉new关键字是楼主手误打上去的吧;P
作者:
血剑无痕
时间:
2014-4-11 17:17
public class Test{
//至于结果为什么是0是因为你虽然调用方法但是没有返回值操作
public static void add3(Integer i){
int var=i.intValue();
var=var+2;
//此步虽然新创建新对象但是没有进行返回
//在这多说句Intger其实是int类型的包装类
i=new Integer(var);
}
public static void main(String args[]){
//这一步是用来进行创建integer对象
Integer i=new Integer(0);
//调用方法但是没有返回值
add3(i);
//由于1.5版本以后新增了自动拆封箱操作所以也可以写成System.out.println(i);
System.out.println(i.intValue());
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2