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){
  3. str="hello";//型参指向字符串 “hello”
  4. }
  5. public static void main(String[] args) {
  6. String s="1" ;
  7. TestFun2.testStr(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. public class Test {
  6. public void a(Map a,String b)
  7. {
  8. a.put("test", b);
  9. }
  10. public void b()
  11. {
  12. Map a = new HashMap();
  13. a.put("test", "a");
  14. String b = "b";
  15. //printMap(a);
  16. a(a,b);
  17. printMap(a);
  18. }
  19. public void printMap(Map a)
  20. {
  21. Set set = a.entrySet();
  22. Iterator it = set.iterator();
  23. while(it.hasNext())
  24. {
  25. Map.Entry e = (Map.Entry)it.next();
  26. System.out.println("Key:"+e.getKey()+" Value:"+e.getValue());
  27. }
  28. }
  29. public static void main(String avgs[])
  30. {
  31. Test t = new Test();
  32. t.b();
  33. }
  34. }

  执行结果,打印: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方法基本数据类型是传值,对象类型传引用,这是千真万确的。

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

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

05-08 15:09