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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yuli2039 中级黑马   /  2014-8-17 20:52  /  2147 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yuli2039 于 2014-8-17 20:51 编辑
  1. class Ca
  2. {
  3.         int value;
  4. }

  5. class  Demo
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 int value = 10;
  10.                 changeInt(value);
  11.                 sop(value);//这里运行结果为10,这是为什么???

  12.                 Ca c = new Ca();
  13.                 c.value = 10;
  14.                 changeCa(c);
  15.                 sop(c.value);//这里输出为11
  16.         }

  17.         public static void changeInt(int value)
  18.         {
  19.                 value++;
  20.         }

  21.         public static void changeCa(Ca c)
  22.         {
  23.                 c.value++;
  24.         }

  25.         public static void sop(Object obj)
  26.         {
  27.                 System.out.println(obj);               
  28.         }
  29. }
复制代码


18 个回复

倒序浏览
楼主需要再看看基础部分视频教程。
回复 使用道具 举报
你把++放在value前边。。。。
回复 使用道具 举报
渠嘉树 发表于 2014-8-17 21:11
你把++放在value前边。。。。

++放前边是加完后再赋值这个我懂,我试了放前边结果还是10,不信你试试!!!!
回复 使用道具 举报
justin1258 发表于 2014-8-17 21:07
楼主需要再看看基础部分视频教程。

哥们高人解释解释???
回复 使用道具 举报
不懂哦,到底是哪里问题呢?求解?
回复 使用道具 举报
华谦 来自手机 中级黑马 2014-8-17 21:34:35
7#
第一次的输出是10,是因为没有将结果return,第二次的结果11,你是用类名直接调用,改变的参数作用于整个类
回复 使用道具 举报
华谦 发表于 2014-8-17 21:34
第一次的输出是10,是因为没有将结果return,第二次的结果11,你是用类名直接调用,改变的参数作用于整个类 ...

试了一下,return value++,结果还是10!
return ++value ;就变成11了。貌似还真是没有return的问题
回复 使用道具 举报
楼上说的对,第一次虽然++了,但是结果没有返回。
回复 使用道具 举报
这里涉及值传递的知识,方法参数传递的是调用者传进去的值,就是10,方法内的value是变量value的copy,无论方法怎么操作value都不会影响变量value。
回复 使用道具 举报
....                    
回复 使用道具 举报
传参啊,第一次只是把基本类型value传到方法中,注意value作用域,出了方法是不改变value的值的,所以打印10
第二次传的是引用类型,在方法中对引用类型修改,会改变引用类型定义的值的,所以++后就编程11了
回复 使用道具 举报
说点我个人的浅见哈:我认为还是出在值传递的问题上,
                int value = 10;
                changeInt(value);
                sop(value);
       这儿操作的是实际上是value的复制值,value本身还是存在于常量池上没发生改变。
                Ca c = new Ca();
                c.value = 10;
                changeCa(c);
       而这儿value归属于对象空间,你实际上是在改变一个对象上的某个属性,那么你的操作将直接导致该对象的
属性发生改变。
回复 使用道具 举报
ximi 中级黑马 2014-8-17 22:22:41
14#
怀念黑海岸 发表于 2014-8-17 22:19
说点我个人的浅见哈:我认为还是出在值传递的问题上,
                int value = 10;
                c ...

回答不错,第一个是值传参,所以值的修改不会影响到原始值。第二个是引用传参,所以值的修改会影响到原始值。
回复 使用道具 举报
姜佳文 发表于 2014-8-17 22:11
传参啊,第一次只是把基本类型value传到方法中,注意value作用域,出了方法是不改变value的值的,所以打印1 ...

楼上正解,回答的好专业啊。
回复 使用道具 举报
就是传参了吧
回复 使用道具 举报
怀念黑海岸 发表于 2014-8-17 22:19
说点我个人的浅见哈:我认为还是出在值传递的问题上,
                int value = 10;
                c ...

懂了,谢谢解答
回复 使用道具 举报
本帖最后由 215041631 于 2014-8-19 08:28 编辑

        public static void changeInt(int value)         {                 value++;         }  你把这个方法中的局部变量加了一,方法结束,局部变量就在栈内存中消失了,你打印的是MAIN方法中的局部变量value,你应该返回一个值来打印。找点资料看一看作用域的知识
回复 使用道具 举报
传参的问题,  你第一次传的参数是基本数据类型, 第二次的看上去修改的也是基本数据类型, 但是你传的参数是引用数据类型.  你可以试一下数组和集合什么的, 只要是引用数据类型的, 不需要返回值,都可以改变其的值.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马