黑马程序员技术交流社区

标题: 一个小问题求解 [打印本页]

作者: heheka123    时间: 2014-4-10 17:42
标题: 一个小问题求解
  1. public class Test{  
  2.         public static void add3(Integer i){  
  3.           int var=i.intValue();  
  4.           var=var+2;  
  5.           i=new Integer(var);  
  6.         }  
  7.         public static void main(String args[]){  
  8.                 Integer i=new Integer(0);  
  9.                 add3(i);  
  10.                 System.out.println(i.intValue());  
  11.         }  
  12. }
复制代码


为什么结果不是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)

20140410181844554.jpg

作者: 小歪    时间: 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
  1. public class Test{  
  2.         //至于结果为什么是0是因为你虽然调用方法但是没有返回值操作
  3.     public static void add3(Integer i){  
  4.            
  5.       int var=i.intValue();  
  6.       var=var+2;  
  7.       //此步虽然新创建新对象但是没有进行返回
  8.       //在这多说句Intger其实是int类型的包装类
  9.       i=new Integer(var);  
  10.     }  
  11.     public static void main(String args[]){
  12.                //这一步是用来进行创建integer对象
  13.             Integer i=new Integer(0);  
  14.             //调用方法但是没有返回值
  15.             add3(i);  
  16.             //由于1.5版本以后新增了自动拆封箱操作所以也可以写成System.out.println(i);
  17.             System.out.println(i.intValue());  
  18.     }  
  19. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2