黑马程序员技术交流社区
标题: 这道题谁给详解下 [打印本页]
作者: 夜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
讲解的很详细,看完后我已经明白了,谢谢
作者: 夜hen冷 时间: 2014-12-8 13:08
能不能再给详细的介绍一下,听着不是很懂
作者: 夜hen冷 时间: 2014-12-8 13:10
能不能举例说明一下
作者: 夜hen冷 时间: 2014-12-8 13:16
这两个i是不是同一个,如果不是那么都在栈中,他们是怎么区分的
作者: lwh316658735 时间: 2014-12-8 15:04
本帖最后由 lwh316658735 于 2014-12-8 15:09 编辑
不是同一个
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 |