论坛首页 入门技术论坛

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

浏览 9223 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-10-12  
建议看看javaCore2,里面有将到java采用的是值传递的方式。
并且在方法中是无法进行值的改变的。
0 请登录后投票
   发表时间:2011-10-12  
java中只有值传递,没有引用传递,每次传递参数,都有一个变量的复制过程,所以就出现了这个问题
0 请登录后投票
   发表时间:2011-10-12   最后修改:2011-10-12
你这玩意运行的时候就相当于
null=new ArrayList();
0 请登录后投票
   发表时间:2011-10-12  
你这里传的是null,而非某个引用 。
0 请登录后投票
   发表时间:2011-10-12  
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");
	}

luciferdevil 写道

   public static void main(String[] args) {  
     List<String> a = new ArrayList<String>();  
     a.add("cc");  
     test(a);
     System.out.println(a.size());//3  
   }  
   public static void test(List<String> a) {  
     a.add("cc");  
     a.add("bb");
   }  

这样是可以滴


   1) 主方法中的a和test方法中的a开辟了两块不同的栈内存,因此我们可以管主方法中的a叫做a(main),test方法中的a叫做a(test)
   2) new出来的对象都放在堆中,通过变量a来调用它们,不管在test方法中有没有new对象,只要你在test方法中重新new一个对象,再通过其引用来赋值,都不会对主方法中的对象有影响~
0 请登录后投票
   发表时间:2011-10-12   最后修改:2011-10-12
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");
	}

luciferdevil 写道

   public static void main(String[] args) {  
     List<String> a = new ArrayList<String>();  
     a.add("cc");  
    test(a);
     System.out.println(a.size());//3  
   }  
   public static void test(List<String> a) {  
     a.add("cc");  
     a.add("bb");
   }  

这样是可以滴


   1) 主方法中的a和test方法中的a开辟了两块不同的栈内存,因此我们可以管主方法中的a叫做a(main),test方法中的a叫做a(test)
   2) new出来的对象都放在堆中,通过变量a来调用它们,不管在test方法中有没有new对象,只要你在test方法中重新new一个对象,再通过其引用来赋值,都不会对主方法中的对象有影响~
0 请登录后投票
   发表时间:2011-10-12  
程序新手 写道
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");
	}

luciferdevil 写道

   public static void main(String[] args) {  
     List<String> a = new ArrayList<String>();  
     a.add("cc");  
     test(a);
     System.out.println(a.size());//3  
   }  
   public static void test(List<String> a) {  
     a.add("cc");  
     a.add("bb");
   }  

这样是可以滴


   1) 主方法中的a和test方法中的a开辟了两块不同的栈内存,因此我们可以管主方法中的a叫做a(main),test方法中的a叫做a(test)
   2) new出来的对象都放在堆中,通过变量a来调用它们,不管在test方法中有没有new对象,只要你在test方法中重新new一个对象,再通过其引用来赋值,都不会对主方法中的对象有影响~

0 请登录后投票
   发表时间:2011-10-12   最后修改:2011-10-12
程序新手 写道
程序新手 写道
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");
	}

luciferdevil 写道

   public static void main(String[] args) {  
     List<String> a = new ArrayList<String>();  
     a.add("cc");  
     test(a);
     System.out.println(a.size());//3  
   }  
   public static void test(List<String> a) {  
     a.add("cc");  
     a.add("bb");
   }  

这样是可以滴


   1) 主方法中的a和test方法中的a开辟了两块不同的栈内存,因此我们可以管主方法中的a叫做a(main),test方法中的a叫做a(test)
   2) new出来的对象都放在堆中,通过引用a来调用它们,不管在test方法中有没有new对象,只要你在test方法中重新new一个对象,再通过其引用来赋值,都不会对主方法中的对象有影响~


0 请登录后投票
   发表时间:2011-10-12  
你出过去的是一个空指针吗? 这样出现了空指针异常
0 请登录后投票
   发表时间:2011-10-12  
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 所以会报错
1 请登录后投票
论坛首页 入门技术版

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