A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© heheka123 中级黑马   /  2014-4-10 17:42  /  898 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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呢?求解 !!

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

8 个回复

倒序浏览
add3函数没有返回值,也就是主函数里面的I和add3函数里面的I不是一个。分别是2个局部变量。所以在主函数输出的I实际上没有数值,默认为0.
回复 使用道具 举报
本帖最后由 赵小豪 于 2014-4-10 18:19 编辑

int类型是基本类型,所以它用于传值属于值传递,它的作用域只在main主函数中有效,所以不发生改变。如果用数组则是引用传递,引用传递是地址则会发生改变。

20140410181844554.jpg (122.7 KB, 下载次数: 9)

20140410181844554.jpg

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
     首先你要分清楚主函数与你的自定义函数中的  i 是两个不同作用范围,他们的内存地址是完全不同,由于你的add3()函数是没有返回值的,所以此函数中对 i 的操作之作用在函数本身中,而主函数中的 i 一直是保持着传递参数前的值,固然是 0。

评分

参与人数 1黑马币 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个只能意会,真的,main中的i变量肯定是main中的,不会是add方法中的,add中的代码执行完没有对main中的数据产生任何影响,不管add方法中的变量叫什么名字
回复 使用道具 举报
你的变量是定义在main()方法中的,当你在调用add3的方法时将变量作为参数传递到add3()方法中,这时会将你的add3方法存到内存中的临时空间并执行,add3方法执行到末尾时,因为add3()方法返回值的类型为void,方法中没有返回值接着这个方法就被从临时的内存空间中释放了,,在main()方法中输出的变量就没能被方法add3改变;那这个变量i就叫做局部变量。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
变量的作用域问题,在主函数中定义了变量 i ,指向创建的对象 new Integer(0),将其传入add3方法中,系统会为add3()开辟一块内存空间,函数中定义了另外的变量var和i指向同一个对象,操作完成后,但由于函数没有返回值,函数的生存期结束后内存会被释放,函数从断点处继续指向,引用变量的值还是原来分配的内存地址,所以结果为0

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
楼主你好:lol
你在Test类的最后为什么要写i=new Integer(var)呢?是强转的意思吗?
使用new 就是再一次实例化一个Integer对象,而且Integer对象的默认值初始化值是0,所以楼主代码的运行结果必须是0啊
要想得到结果是2的话就把new关键字去掉,我感觉new关键字是楼主手误打上去的吧;P
回复 使用道具 举报
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马