Java值传递与引用传递


Java面试题:

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  

答案基本上是:值传递

说明:得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容” 

----------------------------------------------------

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行形式参数值的改变不影响实际参数的值。

引用传递:也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,

在方法执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。


值传递——基本数据类型作为参数(如:String,int)

  1. public static void changeInt(int a, int b){  
  2.     int tmp;  
  3.     tmp = a;  
  4.     a = b;  
  5.     b = tmp;  
  6. }  
参数调用:
  1. // int类型,值传递   
  2. int a = 123;  
  3. int b = 456;  
  4.   
  5. printInt(a, b);  
  6. changeInt(a, b);  
  7. printInt(a, b);  
执行结果:

a = 123; b = 456
a = 123; b = 456
----------------------------------------------------

引用传递——对象或数组作为参数(如:Person,Array)

  1. class Person{  
  2.     String name;  
  3.     int age;  
  4.       
  5.     public Person(String name, int age){  
  6.         this.name = name;  
  7.         this.age  = age;  
  8.     }  
  9.       
  10.     public void changePerson(Person person, String name, int age){  
  11.         person.name = name;  
  12.         person.age  = age;  
  13.     }  
  14.       
  15.     public void printPerson(Person person){  
  16.         System.out.println("name = " + person.name + "; age = " + person.age);  
  17.     }  
  18. }  
参数调用:
  1. // 对象,引用传递   
  2. Person p = new Person("张三"20);  
  3.   
  4. p.printPerson(p);  
  5. p.changePerson(p, "李四"30);  
  6. p.printPerson(p);  
执行结果:
name = 张三; age = 20
name = 李四; age = 30

----------------------------------------------------

完整示例:

  1. package com.val_ref;  
  2.   
  3. // Person类   
  4. class Person{  
  5.     String name;  
  6.     int age;  
  7.       
  8.     public Person(String name, int age){  
  9.         this.name = name;  
  10.         this.age  = age;  
  11.     }  
  12.       
  13.     public void changePerson(Person person, String name, int age){  
  14.         person.name = name;  
  15.         person.age  = age;  
  16.     }  
  17.       
  18.     public void printPerson(Person person){  
  19.         System.out.println("name = " + person.name + "; age = " + person.age);  
  20.     }  
  21. }  
  22.   
  23. class iArray{  
  24.       
  25.     public iArray(){  
  26.   
  27.     }  
  28.       
  29.     public void reverseArray(int []array){  
  30.         int tmp;  
  31.         int len = array.length;  
  32.         for(int i=0; i<len/2; i++){  
  33.             tmp = array[i];  
  34.             array[i]= array[len-1-i];   
  35.             array[len-1-i] = tmp;  
  36.         }  
  37.     }  
  38.       
  39.     public void printArray(int []array){  
  40.           
  41.         for(int i=0; i<array.length; i++){  
  42.             System.out.print(array[i] + "  ");  
  43.         }  
  44.         System.out.println();  
  45.     }  
  46. }  
  47.   
  48.   
  49. public class testValue {  
  50.       
  51.     public static void main(String []args){  
  52.   
  53.         // 对象,引用传递   
  54.         Person p = new Person("张三"20);  
  55.           
  56.         p.printPerson(p);  
  57.         p.changePerson(p, "李四"30);  
  58.         p.printPerson(p);  
  59.   
  60.         // 对象,引用传递   
  61.         int []array = new int[5];  
  62.         for(int i=0; i<array.length; i++){  
  63.             array[i] = i+1;   
  64.         }  
  65.         iArray obj = new iArray();  
  66.         obj.printArray(array);  
  67.         obj.reverseArray(array);  
  68.         obj.printArray(array);  
  69.           
  70.           
  71.         // String类型,值传递   
  72.         String name1 = "张三";  
  73.         String name2 = "李四";  
  74.   
  75.         printString(name1, name2);  
  76.         changeString(name1, name2);  
  77.         printString(name1, name2);  
  78.   
  79.         // int类型,值传递   
  80.         int a = 123;  
  81.         int b = 456;  
  82.   
  83.         printInt(a, b);  
  84.         changeInt(a, b);  
  85.         printInt(a, b);  
  86.     }  
  87.       
  88.     // String类型   
  89.     public static void changeString(String name1, String name2){  
  90.         String tmpName;  
  91.         tmpName = name1;  
  92.         name1 = name2;  
  93.         name2 = tmpName;  
  94.     }  
  95.   
  96.     public static void printString(String name1, String name2){  
  97.         System.out.println("name1 = " + name1 + "; name2 = " + name2);  
  98.     }  
  99.       
  100.     // int类型   
  101.     public static void changeInt(int a, int b){  
  102.         int tmp;  
  103.         tmp = a;  
  104.         a = b;  
  105.         b = tmp;  
  106.     }  
  107.   
  108.     public static void printInt(int a, int b){  
  109.         System.out.println("a = " + a + "; b = " + b);  
  110.     }  
  111. }  

执行结果:
name = 张三; age = 20
name = 李四; age = 30
1  2  3  4  5  
5  4  3  2  1  
name1 = 张三; name2 = 李四
name1 = 张三; name2 = 李四
a = 123; b = 456
a = 123; b = 456

相关内容