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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhaojian 中级黑马   /  2014-5-20 15:07  /  1696 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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的值会变?

8 个回复

倒序浏览
参数间的传递是单向的,也就是只能有实参传递给形参,而不能由形参传递给实参。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++;
}
回复 使用道具 举报
这个问题有点简单,你要注意形参和实参的区别,调用函数时,只能由实参传递给形参,传递的是地址
回复 使用道具 举报
Lin0411 发表于 2014-5-20 15:17
参数间的传递是单向的,也就是只能有实参传递给形参,而不能由形参传递给实参。lz上面的代码中,实参传递给 ...

谢谢, 貌似有点懂了,再研究研究!
回复 使用道具 举报
差点我也晕了
回复 使用道具 举报
这个是因为变量的作用范围引起的。
你那个方法中的a,b属于局部变量,只在change()方法内有效。
在主函数中,打印语句访问的是定义的a=4,b=5.
回复 使用道具 举报
如果change方法后面return回了变量a 和b 呢,那么主函数打印出来的是不是就会变了
回复 使用道具 举报
我也没有想明白这个问题
回复 使用道具 举报
main()方法在调用chang(a,b)方法的过程:
{

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


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