黑马程序员技术交流社区

标题: 关于一个函数调用问题? [打印本页]

作者: 喜欢流浪    时间: 2013-5-24 22:09
标题: 关于一个函数调用问题?
本帖最后由 喜欢流浪 于 2013-5-24 22:33 编辑

public class Demo     
{
        public static int leftshift(int i, int j)
        {
                   i+=j;  //i=i+j
                return i;
        }
        public static void main(String args[])
        {
                int i = 4, j = 2;
                leftshift(i, j);  
                System.out.println(i);//4
                System.out.println(leftshift(i, j));
        }
}
话说有点搞不明白System.out.println(i);  输出结果为何和leftshift(i, j); 没有关系呢 ?

如果把leftshift(i, j); 换成i=leftshift(i, j); 输出结果就会是6;看来上述例子中输出“i”确实和leftshift(i, j); 没有关系!
哪位大神解答下,最好从哪个内存分配结构出发!谢谢啦!

作者: 孙茜茜    时间: 2013-5-24 22:18
返回值不给i的话就白操作了啊,主函数里的i没有变,第二句打印的内容就是一个int 返回值所以是6
作者: 喜欢流浪    时间: 2013-5-24 22:20
孙茜茜 发表于 2013-5-24 22:18
返回值不给i的话就白操作了啊,主函数里的i没有变,第二句打印的内容就是一个int 返回值所以是6 ...

我问的就是第一句打印 为什么和leftshift(i,j) 没有关系
作者: 山鹰    时间: 2013-5-24 22:25
这个i 的值是2  leftshift(i, j)的值是6  调用的上面方法i+=j
作者: 山鹰    时间: 2013-5-24 22:25
这个i 的值是2  leftshift(i, j)的值是6  调用的上面方法i+=j
作者: 谢孔营    时间: 2013-5-24 22:25
从地址出发来解释
函数传参!要么值的传递,要么地址的传递,你的这种情况时值的传递

值的传递有一个特点就是,函数里面局部数据发生改变,函数外面的值不会变。
如果是地址的传递,则由于是实参和形参同时指向一个对象,所以如果在函数内值发生改变
则,此对象改变,那么值就会变。
public class Demo     
{
         public static int leftshift(int i, int j)//基本数据类型作为形参,是值的传递
         {
                    i+=j;  //i=i+j
                 return i;
         }
         public static void main(String args[])
         {
                 int i = 4, j = 2;
                 leftshift(i, j);  
                 System.out.println(i);//4
                 System.out.println(leftshift(i, j));
         }
}
作者: 喜欢流浪    时间: 2013-5-24 22:33
谢孔营 发表于 2013-5-24 22:25
从地址出发来解释
函数传参!要么值的传递,要么地址的传递,你的这种情况时值的传递

嗯 ,谢谢了!非常详细!看来还是基本概念没理解透彻!
作者: 赵乐    时间: 2013-5-24 22:34
  1. public class Demo     
  2. {
  3.         public static int leftshift(int i, int j)
  4.         {
  5.                 i+=j;  //i=i+j
  6.                 System.out.println(i);//这直接打印的是赋值后的i,i=i+j。
  7.                 return i;
  8.         }
  9.         public static void main(String args[])
  10.         {
  11.                 int i = 4, j = 2;
  12.                 leftshift(i, j);  
  13.                 System.out.println(i);//4
  14.                 System.out.println(leftshift(i, j));
  15.         }
  16. }
复制代码
第一句打印 为什么和leftshift(i,j) 没有关系// 因为你在主函数里面设置了i的值为4,
System.out.println(i);//这句打印的是你设置的i的值,肯定是4.
i=leftshift(i, j);// 意思是你又把i重新赋值为leftshift方法里面的结果i+j,然后你再输出的是重新赋值后的i,所以是6.
你可以在leftshift方法里面直接打印i的值。
作者: 喜欢流浪    时间: 2013-5-24 22:35
赵乐 发表于 2013-5-24 22:34
第一句打印 为什么和leftshift(i,j) 没有关系// 因为你在主函数里面设置了i的值为4,
System.out.printl ...

还是非常感谢啊 ,我的问题 地板那层已经解决了!
作者: 王瀛    时间: 2013-5-24 23:45
喜欢流浪 发表于 2013-5-24 22:20
我问的就是第一句打印 为什么和leftshift(i,j) 没有关系

方法leftshift(int i ,int j)中的i 和 j 与 主函数中的 int i = 4 和 int j = 2的 i 和 j 是没有任何关系的

另外,如果按照一楼说的将leftshift(i,j)替换成i = leftshift(i,j) 最后的输出结果与原来是不同的
之前的输出结果是
4
6
更改后代码为:
  1. public class DemoQ     
  2. {
  3.         public static int leftshift(int i, int j)
  4.         {
  5.                         i+=j;  //i=i+j
  6.             return i;
  7.         }
  8.         public static void main(String args[])
  9.         {
  10.                         int i = 4, j = 2;
  11.             i = leftshift(i, j);  
  12.             System.out.println(i);//4
  13.             System.out.println(leftshift(i, j));
  14.         }
  15. }
复制代码
输出为
6
8




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