JAVA中參數傳遞問題的總結(按值傳遞和引用傳遞)

  1. 關於JAVA中參數傳遞問題有兩種,一種是按值傳遞(如果是基本類型),另一種是按引用傳遞(如果是對象). 
  2.  
  3. 首先以兩個例子開始: 
  4.  
  5. 1) 
  6. public class Test2 { 
  7.  
  8. public static void main (String [] args) { 
  9. StringBuffer a = new StringBuffer ("A"); 
  10. StringBuffer b = new StringBuffer ("B"); 
  11. operate (a,b); 
  12. System.out.println(a+","+b); 
  13.  
  14. static void operate(StringBuffer x, StringBuffer y){ 
  15. x.append(y); 
  16. y = x; 
  17. 輸出:AB,B 
  18.  
  19. 2) 
  20. public class Test2 { 
  21.  
  22. public static void add3 (Integer i){ 
  23. int val=i.intValue(); 
  24. val += 3; 
  25. i = new Integer (val); 
  26.  
  27. public static void main (String args [ ] ) { 
  28. Integer i = new Integer (0); 
  29. add3 (i); 
  30. System.out.println (i.intValue ( )); 
  31. 輸出:0 
  32.  
  33. 首先我們應該明白JAVA中的參數傳遞全是以值傳遞的。是基本類型,就拷貝一個基本類型傳進方法;是引用,就拷貝一個引用變量傳進去方法,理解了這兩點就能理解方法操作對象的相關問題了。最好能畫出引用指向對象的圖出來,就能完全理解了。 
  34. 第1題,調用operate方法時,傳入了兩個引用a,b的拷貝x,y,這兩個x,y都指向原a,b引用所指向的對象。x.append(y)對它指向的 對象(即a指向的對象)進行了操作。而x=y,只是兩個拷貝變量在賦值,並沒有影響到原b所指向的對象。所以b所指向的對象仍然爲B。 
  35. 第2題,i=new Integer(val)只是一個引用的拷貝指向了另外一個對象,而原來的i仍然是指向對象new Integer(0)的。 
  36. 把握住了JAVA都是傳值並且傳的都是拷貝的話,類似的題大家都能迎刃而解了。 
  37.  
  38. Java中的參數傳遞只有一種方式: by value. 理論說教太麻煩了,直接看些例子吧: 
  39. 1). 基本類型 
  40. public class A{ 
  41. public static void main(String[] args){ 
  42. int x = 1; 
  43. System.out.println(x);    //1 
  44. test(x); 
  45. System.out.println(x);    //還是1==>By value 
  46.  
  47. static void test(int a){ 
  48. a = 2; 
  49.  
  50. 2). 引用類型 
  51. public class B{ 
  52. public static void main(String[] args){ 
  53. Integer x = new Integer(1); 
  54. System.out.println(x); 
  55. test(x); 
  56. System.out.println(x); 
  57.  
  58.  
  59. static void test(Integer a){ 
  60. a = new Integer(2); 
  61.  
  62. 理解這裏的關鍵是區分對象和引用。 這裏聲明的x是一個引用,而不是一個對象(只是Java把它設計爲看上去好像是對象一樣)。這個引用它指向了一個對象,這個對象就是後面用new關鍵字生成的對象。因此,可以說x指向了一個Integer對象。 
  63. 在調用test方法的時候,程序將x作爲參數傳遞給test方法了。這裏仍然是值傳遞,在test調用過程中,會產生一份新的引用(不妨叫做y)。此時,x和y指向了同一個對象。 
  64. x和y指向的是同一個對象, 由於Java的設計,我們可以通過操作引用來達到操作對象的目的。因此,如果我們此時使用y來修改對象的屬性 (例如,y.someField++); 你可以看到x指向的對象同時也被修改到了。 
  65. 另一方面,如果我們讓y指向另外一個對象, y=new Integer(2); 此時x和y就指向了不同的 
  66. 對象。y修改了它指向的對象的屬性,很顯然不會影響到x指向的對象。 
  67.  
  68. 有人說了數組。數組也是一個引用類型,它的參數傳遞方式按照引用類型的參數傳遞一樣可以解釋得通: 
  69.  
  70. import java.util.Arrays; 
  71.  
  72. public class A{ 
  73. public static void main(String[] args){ 
  74. int[] aa = {3, 2, 1}; 
  75. System.out.println(Arrays.toString(aa)); //[3, 2, 1] 
  76. test(aa); 
  77. System.out.println(Arrays.toString(aa)); //[3, 2, 1] 
  78. test2(aa); 
  79. System.out.println(Arrays.toString(aa)); //[4, 2, 1] 
  80.  
  81. static void test(int[] a){ 
  82. a = new int[]{1, 2, 3};   //指向了新對象 
  83.  
  84. static void test2(int[] a){ 
  85. if(a != null && a.length > 0) 
  86. a[0]++;              //修改原來的那個對象 
  87.  
  88. 對象是傳引用,簡單類型是傳值,不要被網上的一些概念所迷惑!!!你可以自己做個試驗。 
  89. 至於String等類型傳的還是引用。如果你用concat方法,String對象的原值就會被改變。 
  90. 但你如果按如下方法: 
  91. public class Test { 
  92. public static void test(String str) { 
  93. str = "World"
  94. public static void main(String[] args) { 
  95. String string = "Hello"
  96. test(string); 
  97. System.out.println(string); 
  98.  
  99.   運行結果:Hello 
  100. 這裏str = "World" 就等同於 String str=new String("World")。所以結果沒有改變!!! 
  101. 下列程序在1處是否會有異常,如果沒有,輸出是什麼?是否會運行到2處,如果會,輸出是什麼?爲什麼會有這樣的結果? 
  102.  
  103.   import java.util.arraylist; 
  104. import java.util.list; 
  105.  
  106. public class testclass { 
  107.  
  108.  
  109. public static void main(string args[]) { 
  110. list list = new arraylist(); 
  111. test2(list); 
  112. system.out.println(list.size()); // 1處 
  113. test3(list); 
  114. system.out.println(list.size()); // 2處 
  115.  
  116. public static void test2(list list) { 
  117. list = null
  118.  
  119. public static void test3(list list) { 
  120. list.add(“aaaa“); 
  121.  
  122. plumechen: 
  123.  
  124. 不會出錯的。結果是0,1。 
  125.  
  126. 因爲test2(list)傳得是list的引用,我理解成指針置的副本,list=null;只是把那個傳入的值設置爲null,不改變原來 list的指針和內容。test3(list)傳入的一樣,但是執行了list.add()由於傳入指針值的副本也指向原來的那個list的地址,所以原 來的那個list的內容就改變了,size變成了1了 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章