zoukankan      html  css  js  c++  java
  • 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

    ---- 动动手指关注我!或许下次你又能在我这里找到你需要的答案!ZZZZW与你一起学习,一起进步!
  • 相关阅读:
    php删除最后一个字符
    git删除远程分支
    lsof命令
    高效率的全组合算法(Java版实现)
    Java类变量和成员变量初始化过程
    pig命令行快捷键
    java的HashCode方法
    待学习
    长连接和短连接
    Hadoop学习之SecondaryNameNode
  • 原文地址:https://www.cnblogs.com/zzzzw/p/4965235.html
Copyright © 2011-2022 走看看