黑马程序员技术交流社区

标题: 参数传递问题 [打印本页]

作者: 莫问纷飞    时间: 2014-5-20 20:11
标题: 参数传递问题
  1. public class Test1 {

  2.         public static void main(String[] args) throws Exception {
  3.                 int i = 0;
  4.                 show(i);
  5.                 System.out.println(i);//0
  6.                
  7.                 List<String> list = new ArrayList<String>();
  8.                 show(list);
  9.                 System.out.println(list);//aaaa
  10.         }


  11.         public static void show(List<String> list) {
  12.                 list.add("aaaa");
  13.         }

  14.         public static void show(int i) {
  15.                 i = 1;
  16.         }
  17. }
复制代码
请解释一下区别或是这类问题有什么规律,感谢

作者: 875588381    时间: 2014-5-21 15:57
你可以这样认为,当调用方法传递参数的时候,是将参数的copy传递给方法,比如说show(List<String> list),你传入了main()方法中的list,可以认为是,将这个list对象的引用copy一份传递给了show方法的参数list,在方法内部list.add("aaaa"),方法结束后,方法参数list被回收,但是由于list是引用数据类型,main()方法中的list和show()方法中的list实际上操作的是同一块堆内存。至于基本数据类型的对象,就不用多说了吧,道理是一样的,但是注意基本数据类型的变量存储在栈空间上。例如main()方法中的i和show()方法中的i都存储在栈空间,但是其中的值是不相同的。
作者: 莫问纷飞    时间: 2014-5-21 17:13
875588381 发表于 2014-5-21 15:57
你可以这样认为,当调用方法传递参数的时候,是将参数的copy传递给方法,比如说show(List list),你传入了m ...

学习了,谢谢
作者: 875588381    时间: 2014-5-21 17:58
莫问纷飞 发表于 2014-5-21 17:13
学习了,谢谢

不客气,大家互相学习。:)
作者: 邵镛    时间: 2014-5-22 19:37
java中传递参数都是值传递,这值分两种情况:
1、如果参数是常数类型,则这个值就是 数值。
2、如果参数是引用类型,则这个值就是 指针的值(也就是引用的值)。

第一种情况,是将值复制一份,然后直接修改,所以对主函数中的 i 值没有影响
第二种情况,是将主函数中list的引用复制过来了,同理,在show函数中操作的list指向的是同一个地址,那么操作该地址中的内容后,主函数中的list也会跟着改变。


作者: Dark_Horse    时间: 2014-5-22 19:39
学习学习了...
作者: 飘渺≮★耘    时间: 2014-5-23 11:51
这是两个方法重载了,根据参数列表的类型,数量,顺序来决定传参到哪个方法




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