黑马程序员技术交流社区

标题: 一个小程序,望高手解答!!!! [打印本页]

作者: yuli2039    时间: 2014-8-17 20:52
标题: 一个小程序,望高手解答!!!!
本帖最后由 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. }
复制代码



作者: justin1258    时间: 2014-8-17 21:07
楼主需要再看看基础部分视频教程。
作者: 渠嘉树    时间: 2014-8-17 21:11
你把++放在value前边。。。。
作者: yuli2039    时间: 2014-8-17 21:22
渠嘉树 发表于 2014-8-17 21:11
你把++放在value前边。。。。

++放前边是加完后再赋值这个我懂,我试了放前边结果还是10,不信你试试!!!!
作者: yuli2039    时间: 2014-8-17 21:23
justin1258 发表于 2014-8-17 21:07
楼主需要再看看基础部分视频教程。

哥们高人解释解释???
作者: jiali    时间: 2014-8-17 21:30
不懂哦,到底是哪里问题呢?求解?
作者: 华谦    时间: 2014-8-17 21:34
第一次的输出是10,是因为没有将结果return,第二次的结果11,你是用类名直接调用,改变的参数作用于整个类
作者: yuli2039    时间: 2014-8-17 21:38
华谦 发表于 2014-8-17 21:34
第一次的输出是10,是因为没有将结果return,第二次的结果11,你是用类名直接调用,改变的参数作用于整个类 ...

试了一下,return value++,结果还是10!
return ++value ;就变成11了。貌似还真是没有return的问题
作者: 李章敏    时间: 2014-8-17 21:41
楼上说的对,第一次虽然++了,但是结果没有返回。
作者: cs8630323    时间: 2014-8-17 22:01
这里涉及值传递的知识,方法参数传递的是调用者传进去的值,就是10,方法内的value是变量value的copy,无论方法怎么操作value都不会影响变量value。
作者: _童金辉    时间: 2014-8-17 22:08
....                    
作者: 姜佳文    时间: 2014-8-17 22:11
传参啊,第一次只是把基本类型value传到方法中,注意value作用域,出了方法是不改变value的值的,所以打印10
第二次传的是引用类型,在方法中对引用类型修改,会改变引用类型定义的值的,所以++后就编程11了
作者: 怀念黑海岸    时间: 2014-8-17 22:19
说点我个人的浅见哈:我认为还是出在值传递的问题上,
                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
怀念黑海岸 发表于 2014-8-17 22:19
说点我个人的浅见哈:我认为还是出在值传递的问题上,
                int value = 10;
                c ...

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

楼上正解,回答的好专业啊。
作者: 大成哥    时间: 2014-8-17 22:49
就是传参了吧
作者: yuli2039    时间: 2014-8-18 21:06
怀念黑海岸 发表于 2014-8-17 22:19
说点我个人的浅见哈:我认为还是出在值传递的问题上,
                int value = 10;
                c ...

懂了,谢谢解答
作者: 215041631    时间: 2014-8-19 08:25
本帖最后由 215041631 于 2014-8-19 08:28 编辑

        public static void changeInt(int value)         {                 value++;         }  你把这个方法中的局部变量加了一,方法结束,局部变量就在栈内存中消失了,你打印的是MAIN方法中的局部变量value,你应该返回一个值来打印。找点资料看一看作用域的知识

作者: 王凯路路    时间: 2014-8-19 09:08
传参的问题,  你第一次传的参数是基本数据类型, 第二次的看上去修改的也是基本数据类型, 但是你传的参数是引用数据类型.  你可以试一下数组和集合什么的, 只要是引用数据类型的, 不需要返回值,都可以改变其的值.




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