Mark's Java Blog
          MyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOA
          在實(shí)際的開(kāi)發(fā)過(guò)程中,方法調(diào)用是一種很常見(jiàn)的操作,在方法調(diào)用中,關(guān)于參數(shù)的處理可能很多進(jìn)行實(shí)際開(kāi)發(fā)的程序員都不一定理解的很清楚,下面系統(tǒng)的介紹一下Java語(yǔ)言中參數(shù)傳遞的規(guī)則,以及和參數(shù)傳遞相關(guān)的一些問(wèn)題。
                   和其它程序設(shè)計(jì)語(yǔ)言類似,Java語(yǔ)言的參數(shù)傳遞也分為兩種:
          1、 按值傳遞(by value)
          適用范圍:8種基本數(shù)據(jù)類型、String對(duì)象
          特點(diǎn):在內(nèi)存中復(fù)制一份數(shù)據(jù),把復(fù)制后的數(shù)據(jù)傳遞到方法內(nèi)部
          作用:在方法內(nèi)部改變參數(shù)的值,外部數(shù)據(jù)不會(huì)跟著發(fā)生改變
          2、 按址傳遞(by address)
          適用范圍:數(shù)組、除String以外的其他所有類型的對(duì)象
          特點(diǎn):將對(duì)象的地址傳遞到方法內(nèi)部
          作用:在方法內(nèi)部修改對(duì)象的內(nèi)容,外部數(shù)據(jù)也會(huì)跟著發(fā)生改變
          基礎(chǔ)示例代碼:
              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]);
              }   
             }
                   按照上面的參數(shù)傳遞規(guī)則,該代碼的輸出結(jié)果應(yīng)該是:5 abc 2。因?yàn)閕nt類型是按值傳遞,所以把參數(shù)m傳遞到方法t1時(shí),相當(dāng)于又復(fù)制了一份m的值,在方法t 1內(nèi)部修改的是復(fù)制后的值,所以m的值不變,s1的輸出和m類似。而arr是數(shù)組,屬于按址傳遞,也就是把a(bǔ)rr的地址傳遞到了方法t3內(nèi)部,在方法t3內(nèi)部修改數(shù)組中的值時(shí),原來(lái)的內(nèi)容也發(fā)生改變。
                   以上特性是Java語(yǔ)言中的規(guī)定,在語(yǔ)法上無(wú)法指定參數(shù)傳遞是按值傳遞還是按址傳遞,但是可以通過(guò)下面的變換實(shí)現(xiàn):
          1、 對(duì)于按值傳遞的參數(shù),如果需要在方法調(diào)用以后修改參數(shù)的值,可以利用返回值來(lái)實(shí)現(xiàn)。
          2、 對(duì)于按值傳遞的參數(shù),如果需要在方法內(nèi)部修改時(shí)原來(lái)的參數(shù)不改變,則可以在方法內(nèi)部重新創(chuàng)建該對(duì)象實(shí)現(xiàn)。
          示例代碼如下:
          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){
                  //創(chuàng)建新的數(shù)組并賦值
                  int[] newArray = new int[array.length];
                  //數(shù)據(jù)拷貝
                 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]);
              }   
          }
          這樣,程序的輸出結(jié)果就將是:10 123   1
          在實(shí)際的程序開(kāi)發(fā)中,可以根據(jù)需要使用類似的結(jié)構(gòu)來(lái)進(jìn)行實(shí)現(xiàn)。
                   下面再介紹一個(gè)參數(shù)傳遞的常見(jiàn)應(yīng)用,利用參數(shù)傳遞實(shí)現(xiàn)返回值,這樣的功能在IO類設(shè)計(jì)的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方法內(nèi)部修改了數(shù)組的值以后,外部數(shù)組a的值也會(huì)發(fā)生改變,間接實(shí)現(xiàn)了返回值的效果。當(dāng)然,在該示例代碼中,因?yàn)橹环祷匾粋€(gè)參數(shù),所以作用體現(xiàn)的不明顯,如果需要返回多個(gè)參數(shù)時(shí),使用按址傳遞是一種不錯(cuò)的主意。
              因時(shí)間倉(cāng)促,疏漏之處難免,請(qǐng)大家積極補(bǔ)充和指正。
          posted on 2008-04-18 17:01 Mark 閱讀(251) 評(píng)論(0)  編輯  收藏 所屬分類: Java SE
           
          主站蜘蛛池模板: 台中市| 华阴市| 达拉特旗| 祁门县| 拉萨市| 通江县| 日土县| 博乐市| 五家渠市| 岐山县| 尚义县| 密云县| 三江| 新宁县| 江油市| 湄潭县| 鹰潭市| 高雄市| 贵州省| 松阳县| 张掖市| 济宁市| 峨山| 和平县| 银川市| 萍乡市| 泽州县| 郓城县| 剑阁县| 廊坊市| 集贤县| 苍山县| 华容县| 丹巴县| 汉沽区| 巴马| 革吉县| 津市市| 远安县| 横峰县| 多伦县|