论坛首页 入门技术论坛

Java中的引用传递参数 为什么错误?

浏览 9221 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-10-12  
javascript也是一样滴
大家讲的都一样
还争什么
0 请登录后投票
   发表时间: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 ;

这样解释应该比较合理、清楚 ; 
0 请登录后投票
   发表时间:2011-10-12  
说了这么多,楼主dubug就可以了,清晰得很
0 请登录后投票
   发表时间: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)方法体里才创建实例么?


嗯,确实错了,红色字体,低级错误。不怕犯错,怕不改错。
0 请登录后投票
   发表时间:2011-10-12  
这是个搞笑贴,鉴定完毕~!
0 请登录后投票
   发表时间: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()) 抛空指针异常
0 请登录后投票
   发表时间: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,从而导致了下一句的错误~


值传递和引用传递本来就是相对的
形参本来就不能等同于传入的对象
0 请登录后投票
   发表时间: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()会出现空指针异常
0 请登录后投票
   发表时间:2011-10-12  
  因为传递的只是一个引用的copy。。。但是这个copy也指向了引用指向的对象。。。
  当你另外new一个对象出来的时候。。该copy就指向了另一个对象
0 请登录后投票
   发表时间: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");   
}  
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics