黑马程序员技术交流社区

标题: 关于变量赋值的问题 [打印本页]

作者: zhaojian    时间: 2014-5-20 15:07
标题: 关于变量赋值的问题
本帖最后由 zhaojian 于 2014-5-21 20:25 编辑

今天看到一道题:
  1. class Chp1
  2. {
  3. public static void main(String[] args)
  4. {
  5. int a=4,b=5;
  6. change(a,b);
  7. System.out.println("a="+a+",b="+b);
  8. }
  9. public static void change(int a ,int b)
  10. {
  11. b+=a;
  12. a++;
  13. System.out.println("a="+a+",b="+b);
  14. }
  15. }
复制代码
打印结果是:a=5,b=9
                     a=4,b=5  
为什么下面的a,b值没有变,在什么情况下a,b的值会变?


作者: Lin0411    时间: 2014-5-20 15:17
参数间的传递是单向的,也就是只能有实参传递给形参,而不能由形参传递给实参。lz上面的代码中,实参传递给change函数中的形参a,b,函数体中改变的是形参的值,但此时形参的值又不能反向传递给实参,因此a,b的值并没有任何改变。lz可以将main函数中的a,b封装成Integer对象,将a,b这两个Integer对象的引用作为实参传入change函数,再根据java的自动装箱和拆箱的功能就可以改变a,b的值了。
void change(Integer a, Integer b)
{
    b+=a;
    a++;
}

作者: 雨落千木的时节    时间: 2014-5-20 15:52
这个问题有点简单,你要注意形参和实参的区别,调用函数时,只能由实参传递给形参,传递的是地址
作者: zhaojian    时间: 2014-5-20 15:59
Lin0411 发表于 2014-5-20 15:17
参数间的传递是单向的,也就是只能有实参传递给形参,而不能由形参传递给实参。lz上面的代码中,实参传递给 ...

谢谢, 貌似有点懂了,再研究研究!
作者: 927233671    时间: 2014-5-20 16:37
差点我也晕了
作者: amao    时间: 2014-5-21 00:44
这个是因为变量的作用范围引起的。
你那个方法中的a,b属于局部变量,只在change()方法内有效。
在主函数中,打印语句访问的是定义的a=4,b=5.

作者: lindegen    时间: 2014-5-21 09:01
如果change方法后面return回了变量a 和b 呢,那么主函数打印出来的是不是就会变了
作者: 张志民    时间: 2014-5-21 10:55
我也没有想明白这个问题
作者: 艮昕辶    时间: 2014-5-21 14:35
main()方法在调用chang(a,b)方法的过程:
{

int a=a;
int b=b;
int temp=a;
a=b;
b=temp;
}







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