黑马程序员技术交流社区

标题: 这道题谁给详解下 [打印本页]

作者: 夜hen冷    时间: 2014-12-8 10:26
标题: 这道题谁给详解下
public class Test      
{
         publicstatic void leftshift(int i, int j)
         {
               i+=j;
         }
         publicstatic void main(String args[])
         {
                   inti = 4, j = 2;
                   leftshift(i,j);
                   System.out.println(i);//4  leftShift函数没关系。
         }
}


作者: zhaozhao    时间: 2014-12-8 10:37
你定义了两个变量i,j,leftshift(i,j)是将变量传到函数中运行“i+=j;”这句话。但是你的函数并没返回运行结果。i不是成员变量,所以值依然为4。
作者: kerner    时间: 2014-12-8 10:56
记住函数调用参数是传值。
作者: 眸眼前缘    时间: 2014-12-8 11:01
i+=j;这句话它的i地址始终没有,变化的只是i对应的变量值,你打印i只能打印他的地址值对应的变量值
作者: lwh316658735    时间: 2014-12-8 11:31
非引用型数据类型 在函数参数传递过程是值传递。

主函数里的 i 在进入内存中是在栈内存中开辟出来了为4
执行到leftshift(int i, int j)函数时,也在栈内存中开辟出新的空间,
同时函数的两个参数也在该空间分配新的空间,所以函数的参数int i 就是函数leftshift里的局部变量,修改也是修改函数内i变量的值,在函数执行完后释放内存,该i也不存在了,所以与外面的i是无关的。


作者: xingyunjunjun    时间: 2014-12-8 11:55
静态方法只能使用静态成员
作者: 夜hen冷    时间: 2014-12-8 13:06
zhaozhao 发表于 2014-12-8 10:37
你定义了两个变量i,j,leftshift(i,j)是将变量传到函数中运行“i+=j;”这句话。但是你的函数并没返回运行结 ...

讲解的很详细,看完后我已经明白了,谢谢
作者: 夜hen冷    时间: 2014-12-8 13:08
kerner 发表于 2014-12-8 10:56
记住函数调用参数是传值。

能不能再给详细的介绍一下,听着不是很懂
作者: 夜hen冷    时间: 2014-12-8 13:10
眸眼前缘 发表于 2014-12-8 11:01
i+=j;这句话它的i地址始终没有,变化的只是i对应的变量值,你打印i只能打印他的地址值对应的变量值 ...

能不能举例说明一下
作者: 夜hen冷    时间: 2014-12-8 13:16
lwh316658735 发表于 2014-12-8 11:31
非引用型数据类型 在函数参数传递过程是值传递。

主函数里的 i 在进入内存中是在栈内存中开辟出来了为4

这两个i是不是同一个,如果不是那么都在栈中,他们是怎么区分的
作者: lwh316658735    时间: 2014-12-8 15:04
本帖最后由 lwh316658735 于 2014-12-8 15:09 编辑
夜hen冷 发表于 2014-12-8 13:16
这两个i是不是同一个,如果不是那么都在栈中,他们是怎么区分的

不是同一个
         publicstatic void leftshift(int i, int j)

         {

               i+=j;

         }
这个方法你可以理解成这样
         publicstatic void leftshift(int a, int j)

         {
               int i=0;
               i=a+j;

         }
函数里的变量作用范围只能再函数内。
leftshift 里的int i 和main里的 int i 是没有任何关系的。
就等于两个不同的班有两个名字一样的人 A,不管是哪个班的老师叫A过去一趟 都是指本班的吧。

作者: lidinghai    时间: 2014-12-8 15:56
你返回的是i的值啊,i又没有变。
作者: HelloWorld!    时间: 2014-12-8 16:08
两个i分别定义在两个不同的方法中,各自在自己定义的方法中有效,别被名字迷惑
作者: ben_vs_cong    时间: 2014-12-8 20:42
i=4    j = 2,是因为,你虽然传的是实参,但是你没有返回值,而在方法里面定义的i的作用域结束于方法的大括号,而你输出的i是主函数定义的变量。两者都没有关系,所以就不会改变值。如果你想改变值,那么就可以写个返回值让主函数里面的i接收,或者把i定义为全局变量。
作者: 高慧觉    时间: 2014-12-8 22:07
调用的leftshift函数没有返回值。
作者: SpiderManZZH    时间: 2014-12-8 22:37
两个函数的值不会影响,而且没有返回值。
作者: lwj123    时间: 2014-12-9 15:15
调用完函数之后并没有返回值对i或j作修改,所以输出结果还是跟之前一样
作者: 李振乐    时间: 2014-12-9 15:33
大哥,没有返回值。。。。  publicstatic int leftshift(int i, int j)

         {

              return i+=j;

         }
就好了




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