歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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
Copyright © Linux教程網 All Rights Reserved