Fork me on GitHub

java 函数形参传值和传引用的区别

java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。

(一)基本数据类型:传值,方法不会改变实参的值。

 1   public class TestFun {
 2   public static void testInt(int i){
 3   i=5;
 4   }
 5   public static void main(String[] args) {
 6   int a=0 ;
 7   TestFun.testInt(a);
 8   System.out.println("a="+a);
 9   }
10   }

程序执行结果:a=0 。

(二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。

  举两个例子:

  (1)方法体内改变形参引用,但不会改变实参引用 ,实参值不变。

 1   public class TestFun2 {
 2   public static void testStr(String str){//str是形式参数
 3   str="hello";//型参指向字符串 “hello”
 4   }
 5   public static void main(String[] args) {
 6   String s="1" ;
 7   TestFun2.testStr(s);//s是实参
 8   System.out.println("s="+s); //实参s引用没变,值也不变
 9   }
10   }

执行结果打印:s=1

 

  (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。

 1         import java.util.HashMap;
 2         import java.util.Iterator;
 3         import java.util.Map;
 4         import java.util.Set;
 5 
 6         public class Test {
 7 public void a(Map a,String b)
 8 {
 9 a.put("test", b);
10 }
11 
12 public void b()
13 {
14 Map a = new HashMap();
15 a.put("test", "a");
16 String b = "b";
17 //printMap(a);
18 a(a,b);
19 printMap(a);
20 }
21 
22 public void printMap(Map a)
23 {
24 Set set = a.entrySet();
25 Iterator it = set.iterator();
26 while(it.hasNext())
27 {
28 Map.Entry e = (Map.Entry)it.next();
29 System.out.println("Key:"+e.getKey()+" Value:"+e.getValue());
30 
31 }
32 }
33 
34 public static void main(String avgs[])
35 {
36 Test t = new Test();
37 t.b();
38 }
39 }

执行结果,打印:Key:test Value:b 。可见在方法a()内改变了实参的内容。

 

  (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer :

 1   public class TestFun4 {
 2   public static void testStringBuffer(StringBuffer sb){
 3   sb.append("java");//改变了实参的内容
 4   }
 5   public static void main(String[] args) {
 6   StringBuffer sb= new StringBuffer("my ");
 7   new TestFun4().testStringBuffer(sb);
 8   System.out.println("sb="+sb.toString());//内容变化了
 9   }
10   }

执行结果,打印:sb=my java 。

  所以比较参数是String和StringBuffer 的两个例子就会理解什么是“改变实参对象内容”了。

 

  总结:

  第一:java方法基本数据类型是传值,对象类型传引用,这是千真万确的。

  第二:当参数是对象时,无论方法体内进行了何种操作,都不会改变实参对象的引用

  第三:当参数是对象时,只有在方法内部改变了对象的内容时,才会改变实参对象内容。

 

转载自http://blog.csdn.net/tianlincao/article/details/6875593

posted @ 2015-11-14 22:32  ZZZZW  阅读(768)  评论(0编辑  收藏  举报
AmazingCounters.com