Mark's Java Blog
          MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA
          在實際的開發過程中,方法調用是一種很常見的操作,在方法調用中,關于參數的處理可能很多進行實際開發的程序員都不一定理解的很清楚,下面系統的介紹一下Java語言中參數傳遞的規則,以及和參數傳遞相關的一些問題。
                   和其它程序設計語言類似,Java語言的參數傳遞也分為兩種:
          1、 按值傳遞(by value)
          適用范圍:8種基本數據類型、String對象
          特點:在內存中復制一份數據,把復制后的數據傳遞到方法內部
          作用:在方法內部改變參數的值,外部數據不會跟著發生改變
          2、 按址傳遞(by address)
          適用范圍:數組、除String以外的其他所有類型的對象
          特點:將對象的地址傳遞到方法內部
          作用:在方法內部修改對象的內容,外部數據也會跟著發生改變
          基礎示例代碼:
              public class Test1{
              public static void t1(int n){
                  n = 10;
              }
              public static void t2(String s){
                         s = "123";
              }
              public static void t3(int[] array){
                  array[0] = 2;
              }
              public static void main(String[] args){
                     int m = 5;
                  t1(m);
                  System.out.println(m);
                  String s1 = "abc";
                  t2(s1);
                  System.out.println(s1);
                     int[] arr = {1,2,3,4};
                  t3(arr);
                  System.out.println(arr[0]);
              }   
             }
                   按照上面的參數傳遞規則,該代碼的輸出結果應該是:5 abc 2。因為int類型是按值傳遞,所以把參數m傳遞到方法t1時,相當于又復制了一份m的值,在方法t 1內部修改的是復制后的值,所以m的值不變,s1的輸出和m類似。而arr是數組,屬于按址傳遞,也就是把arr的地址傳遞到了方法t3內部,在方法t3內部修改數組中的值時,原來的內容也發生改變。
                   以上特性是Java語言中的規定,在語法上無法指定參數傳遞是按值傳遞還是按址傳遞,但是可以通過下面的變換實現:
          1、 對于按值傳遞的參數,如果需要在方法調用以后修改參數的值,可以利用返回值來實現。
          2、 對于按值傳遞的參數,如果需要在方法內部修改時原來的參數不改變,則可以在方法內部重新創建該對象實現。
          示例代碼如下:
          public class Test2{
              public static int t1(int n){
                  n = 10;
                  return n;
              }
              public static String t2(String s){
                            s = "123";
                            return  s;
              }
              public static void t3(int[] array){
                  //創建新的數組并賦值
                  int[] newArray = new int[array.length];
                  //數據拷貝
                 System.arraycopy(array,0,newArray,0,array.length);
                  newArray[0] = 2;
              }
              public static void main(String[] args){
                            int m = 5;
                  //重新賦值
                  m = t1(m);
                  System.out.println(m);
                  String s1 = "abc";
                  //重新賦值
                  s1 = t2(s1);
                  System.out.println(s1);
                            int[] arr = {1,2,3,4};
                  t3(arr);
                  System.out.println(arr[0]);
              }   
          }
          這樣,程序的輸出結果就將是:10 123   1
          在實際的程序開發中,可以根據需要使用類似的結構來進行實現。
                   下面再介紹一個參數傳遞的常見應用,利用參數傳遞實現返回值,這樣的功能在IO類設計的read方法中大量使用。示例代碼如下:
          public class Test3{
              public static void initArray(int[] array){
                            for(int i = 0;i < array.length;i++){
                                      array[i] = i;
                  }
              }
              public static void main(String[] args){
                            int[] a = new int[10];
                  initArray(a);
                  for(int i = 0;i < a.length;i++){
                                      System.out.println(a[i]);
                  }
              }
          }
                   在該示例代碼中,在initArray方法內部修改了數組的值以后,外部數組a的值也會發生改變,間接實現了返回值的效果。當然,在該示例代碼中,因為只返回一個參數,所以作用體現的不明顯,如果需要返回多個參數時,使用按址傳遞是一種不錯的主意。
              因時間倉促,疏漏之處難免,請大家積極補充和指正。
          posted on 2008-04-18 17:01 Mark 閱讀(255) 評論(0)  編輯  收藏 所屬分類: Java SE
           
          主站蜘蛛池模板: 荃湾区| 绥阳县| 泸定县| 油尖旺区| 五寨县| 武川县| 梅州市| 宜兰市| 永州市| 达孜县| 方正县| 昂仁县| 清河县| 黑龙江省| 喜德县| 乐至县| 澜沧| 滨海县| 柘城县| 金乡县| 屏东县| 瑞丽市| 翁源县| 姜堰市| 伊金霍洛旗| 甘肃省| 陆丰市| 正镶白旗| 山东| 大埔县| 鞍山市| 宜城市| 新河县| 沅陵县| 台中县| 高青县| 桑日县| 宁海县| 应城市| 丹寨县| 大荔县|