锁定老帖子 主题:Java中的引用传递参数 为什么错误?
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-12
javascript也是一样滴
大家讲的都一样 还争什么 |
|
返回顶楼 | |
发表时间:2011-10-12
最后修改:2011-10-12
问题是这样,main中如果a = new ArrayList<String>(); 加入a执行内存单元为 11752这个地址;
把 a 传入到 test 后, 再用 a.add("a"); a.add("b"); 那么main中在调用 a.size(), 将得到的结果是2; 应该将 11752 传入到 test中后, test中的a.add方法就会在a的指向上进行赋值,因此,main中的方法再调用a.size后就会发现大小是2 ; 但是如果在 test中重新new的话,那么a中的test将不在指向 11752; main中的方法再调用a.size后就会得到0 ; 这样解释应该比较合理、清楚 ; |
|
返回顶楼 | |
发表时间:2011-10-12
说了这么多,楼主dubug就可以了,清晰得很
|
|
返回顶楼 | |
发表时间:2011-10-12
BBjava 写道 我觉得是这样:
public static void main(String[] args) { List<String> a=null; test(a);//这里a 的值是null; System.out.println(a.size()); } public static void test(List<String> a) { a = new ArrayList<String>(); a.add("cc"); } 首先这个代码在运行时就会出错,将会抛出nullPointerException,出错在于,第3行 test(a); 因为方法调用时,jvm会检查参数,是null就会抛出出nullPointerException。 而且在test(List<String> a)方法实现上,不知道为什么要这么实现,上面代码意思是想把a 在test(List<String> a)方法体里才创建实例么? 嗯,确实错了,红色字体,低级错误。不怕犯错,怕不改错。 |
|
返回顶楼 | |
发表时间:2011-10-12
这是个搞笑贴,鉴定完毕~!
|
|
返回顶楼 | |
发表时间:2011-10-12
llkbomb 写道 NSCoffee 写道 请问下面的代码为什么会出现错误?
public static void main(String[] args) { List<String> a=null; test(a); System.out.println(a.size()); } public static void test(List<String> a) { a = new ArrayList<String>(); a.add("cc"); } 这个是引用传递 但是你要注意 main中的a和test中的a是两个不同的对象 在调用test的时候 是把main中的a和test中的a指向同一个对象 所以是他们是相同的 都为null 但是你在test中重新new了一个对象 并且赋值为a 这样的话 main中的a和test中的a将分别指向不同的对象 main中的a仍然为null 但test中的a不为Null 这样的话 你在System.out.println(a.size());的时候 其实是null.size 所以会报错 基本整理下楼上的思路,我一直是坚持认为java是存在引用传递的,即传递内存地址给对象指针 只是这个例子中的传递的引用本身指向一个null(即未分配内存空间的一个空地址) 1)a ->内存空间地址为null 2)传递给test方法后 3)test.a -> 指向a的内存地址空间 (这里的a 和 test.a其实是两个对象,只是由于引用传递,所以指向同一个地址空间) 4)test.a被重新分配内存地址,但是a指向的地址空间仍为null,所以导致System.out.println(a.size()) 抛空指针异常 |
|
返回顶楼 | |
发表时间:2011-10-12
nianien 写道 BBjava 写道 我觉得是这样:
public static void main(String[] args) { List<String> a=null; test(a);//这里a 的值是null; System.out.println(a.size()); } public static void test(List<String> a) { a = new ArrayList<String>(); a.add("cc"); } 首先这个代码在运行时就会出错,将会抛出nullPointerException,出错在于,第3行 test(a); 因为方法调用时,jvm会检查参数,是null就会抛出出nullPointerException。 而且在test(List<String> a)方法实现上,不知道为什么要这么实现,上面代码意思是想把a 在test(List<String> a)方法体里才创建实例么? 没有文化真可怕,这里的错误不是由于调用了test()方法,而是由于System.out.println(a.size());这句导致的~ java是传值引用,所以test方法里对a任何操作都与main方法里的a无关~,当test()方法返回后,main方法的a还是null,从而导致了下一句的错误~ 值传递和引用传递本来就是相对的 形参本来就不能等同于传入的对象 |
|
返回顶楼 | |
发表时间:2011-10-12
jxdncsl 写道 java里面只有值传递,没有引用传递(这样好理解)。
调用test(a)时,是拷贝了一个另一个引用值,让它类似的指向null。 所以穿进去的是拷贝的a。。。,在方法里面修改对象,a当然不会收到影响。 把 a = new ArrayList<String>();写到main方法里,就不会有错了。 a.size也会有值的。因为2个应用指向同一个对象,所以就有值了。。 支持,java中看成值传递比较好理解,传入参数a非main方法中的a,而是main方法中a的一个备份,所以调用方法中的a和main中的不同,调用main中的a.size()会出现空指针异常 |
|
返回顶楼 | |
发表时间:2011-10-12
因为传递的只是一个引用的copy。。。但是这个copy也指向了引用指向的对象。。。
当你另外new一个对象出来的时候。。该copy就指向了另一个对象 |
|
返回顶楼 | |
发表时间:2011-10-12
....你这个是值传递吧 不是引用传递 这样才算引用传递
public static void main(String[] args) { List<String> a=null; test(a); System.out.println(a.size()); } public static void test(List<String> a) { a.add("cc"); } |
|
返回顶楼 | |