黑马程序员技术交流社区
标题:
能告诉我为什么是这个结果吗?
[打印本页]
作者:
H._张_♂
时间:
2014-4-15 19:44
标题:
能告诉我为什么是这个结果吗?
为什么无法改变i的值?谁能深层次的帮我分析下!!
public class StractTest {
public static void main(String args[])
{
int i = 4, j = 2;
leftshift(i, j);
System.out.println(i);
}
public static void leftshift(int i, int j)
{
i=i+j;
}
}
复制代码
作者:
nestor
时间:
2014-4-15 19:46
本帖最后由 nestor 于 2014-4-15 19:53 编辑
这样就可以了
public class StractTest {
public static void main(String args[])
{
int i = 4,j = 2;
i=leftshift(i, j);
System.out.println(i);
}
public static int leftshift(int i, int j)
{
i=i+j;
return i;
}
}
复制代码
作者:
anqi
时间:
2014-4-15 19:49
本帖最后由 anqi 于 2014-4-15 19:53 编辑
应该是4,这个问题其实挺经典,我也犯过这种错误,
你函数中的i是个局部变量,它和成员变量i不是一个,指向的不是同一个内存空间,自然不能相互影响。你的函数和我的函数其实是一样的。
public static void leftshift(int x, int y)
{
x=x+y;
}
作者:
月光海
时间:
2014-4-15 19:52
本帖最后由 月光海 于 2014-4-15 19:55 编辑
你改变的是leftshift方法中的i的值,你将调用的方法的void的改为int,就可以,然后在main中用i接收,main方法中的i和leftshift方法中的i指向的并不是同一内存空间,传过去的只是copy的值,这个你要看透毕老师讲的引用类型和值类型参数传递就明白了
public static void main(String args[])
{
int i = 4, j = 2;
i= leftshift(i, j);
System.out.println(i);
}
public static int leftshift(int i, int j)
{
return i=i+j;
}
复制代码
作者:
你为谁归来
时间:
2014-4-15 19:59
main()和leftshift()里面的I不是同一个,是2个局部变量,所以leftshift()里面改变了I,main()里面的I还是不变的!
作者:
kuroro自走核炮
时间:
2014-4-15 20:00
class StractTest {
public static void main(String args[])
{
int i = 4, j = 2;
System.out.println(leftshift(i, j));
}
public static int leftshift(int i, int j)
{
return i=i+j;
}
}
实测,这样可以解决问题。具体原因一个是楼主你的leftshift方法中没有返回值。另一个是函数返回的是一个值,需要声明一下变量i的值变成了这个返回的值。
即 System.out.println(leftshift(i, j)); 这一步也可以分开写成
i=leftshift(i, j);
System.out.println()i;
作者:
赵连明
时间:
2014-4-15 20:01
形参跟实参的差别.
java中传参数只有值传递 ,对于基本类型,是传的具体的数值,而对于对象等引用类型,传递 的则是引用.所谓值传递,就是说传递的东西是实参的复制品,直接改变实参是做不到的.
作者:
菜小徐
时间:
2014-4-15 20:15
各个方法都会在栈中开辟一块空间,你改变的是leftshift方法中的i,而不是main方法中的i,具体你可以去看一下视频中的对象内存体现那一块,毕老师有详细讲解
作者:
zms2100
时间:
2014-4-15 20:18
这是Java中基本数据类型参数传递 与 引用数据类型参数传递 的区别。
现在这时间点在YY: 85155393(传智)刚好在讲这个,或之后去下载相关的视频。
作者:
曹冬明
时间:
2014-4-15 20:25
多数的编程语言对于基本类型的参数传的都是值,也就是讲原变量的拷贝传入方法中,他并不会改变原变量的值,我学java是看的毕老师的视频,好像没有针对这个讲过,C里面就有讲,C里面有引用这个知识点。我看上面有人说方法没有返回值,其实有返回值也一样,他改变的不是原来的i,而是将i和j的复制品传入方法中,将运算的结果返回,又重新赋给了i,如果只从实现功能上说算是实现了,实质上和返回值并没有关系,i的改变不是在方法中,而是在main中被重新赋值改变的
作者:
\(^o^)/
时间:
2014-4-15 20:33
您的主函数中调用了函数但并没有赋值进去,而且下面的函数应该把void改成int,并把i=i+j改成return i+j。
作者:
\(^o^)/
时间:
2014-4-15 20:35
具体可以这么写:
public class Demo
{
public static void main(String args[])
{
leftshift(4,2);
leftshift(5,3);
}
public static void leftshift(int i, int j)
{
System.out.println(i+j);
}
}
作者:
luoyilan222
时间:
2014-4-15 20:42
Unnamed QQ Screenshot20140415204149.png
(122.14 KB, 下载次数: 58)
下载附件
2014-4-15 20:42 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2