JAVA

          java

          常用鏈接

          統(tǒng)計

          最新評論

          Java中參數(shù)傳遞是傳值還是傳址?

          什么是值傳遞?什么是引用傳遞?

          值傳遞是將要傳遞的值作為一副本傳遞.如
               int i=4;
               int j=i;
               這里相當于把14復制了一個副本給j,結果是i=4,j=4

          引用傳遞,傳遞的是引用對象的內存地址
               int *p,*p1;
               int j=5; *p=j; //這里是把j在內存當中的地址賦給了指針p
               p1=p;  //這里是把指針p中保存的地址(就是j的地址)賦給了指針p1
               j=4; //這里改變j的值 輸出結果是 j=4 , *p=4 , *p1=4 //因為p和p1指向的都是j 所以他們的值隨j值改變
          (以上說明和代碼來自http://zhidao.baidu.com/question/31191252.html)


          Java中函數(shù)參數(shù)的傳遞是值傳遞還是引用傳遞?

          Java中參數(shù)傳遞時傳遞到函數(shù)中的參數(shù)都是原變量的一份拷貝,對于非類類型如int,float等,這份拷貝自然和原變量脫離了關系,這不難理解;
          而對于類的實例而言,這份拷貝恰巧是實例引用的拷貝,它(參數(shù))指向的實例地址和原實例引用指向的實例地址都是一樣的,因此對參數(shù)的修改有時也會影響到實例本身,故此造成了Java傳遞類實例是傳遞的引用即地址的假象,如下面例子中的changeMemberField函數(shù),但是我們把參數(shù)指向的地址改到別的實例上時,如changeMember函數(shù),我們會發(fā)現(xiàn)參數(shù)和原實例引用再也不會發(fā)生關系了,這里證明Java中參數(shù)傳遞是完完全全是傳值而不是傳址。

          例子代碼:

          代碼:
          package com.sitinspring;

          public class ChangeClass{
              
          public void changeInt(int i){
                  i
          =5;
              }
              
              
          public void changeLong(long i){
                  i
          =555;
              }
              
              
          public void changeString(String str){
                  str
          ="5555";
              }
              
              
          public void changeMember(Member member){
                  member
          =new Member("Cindy",35);
              }
              
              
          public void changeMemberField(Member member){
                  member.setAge(
          20);
                  member.setName(
          "Andy");
              }
              
              
          public static void main(String[] args){
                  ChangeClass changeClass
          =new ChangeClass();
                  
                  
          int intValue=10;
                  changeClass.changeInt(intValue);
                  System.out.println(intValue);
                  
                  
          long longValue=10;
                  changeClass.changeLong(longValue);
                  System.out.println(longValue);
                  
                  String stringValue
          ="1234";
                  changeClass.changeString(stringValue);
                  System.out.println(stringValue);        
                  
                  Member member2
          =new Member("Douglas",45);
                  changeClass.changeMember(member2);
                  System.out.println(member2);
                  
                  Member member
          =new Member("Bill",25);
                  changeClass.changeMemberField(member);
                  System.out.println(member);
              }
          }

          package com.sitinspring;

          public class Member{
              
          private String name;
              
          private int age;
              
              
          public Member(String name,int age){
                  
          this.age=age;
                  
          this.name=name;
              }
              
              
          public String toString(){
                  
          return "Member name="+name+" age="+age;
              }

              
          public int getAge() {
                  
          return age;
              }

              
          public void setAge(int age) {
                  
          this.age = age;
              }

              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }    
          }

          輸出
          10
          10
          1234
          Member name
          =Douglas age=45
          Member name
          =Andy age=20

          解釋
          第一個輸出10是因為int是基本類型,傳遞的參數(shù)是intValue的拷貝,對拷貝的修改對原值intValue沒有影響.
          第一個輸出10和上面是一個道理.
          第三個輸出1234.由于String是類類型, str是stringValue的地址拷貝,參數(shù)str指向的地址和stringValue的一致,但在函數(shù)changeString 中,由于String的特殊性, str=“5555”和str=new String(“5555”)是等價的, str指向了新的”5555”所在的地址,此句后str就與原來的stringValue徹底脫離了聯(lián)系.
          第四個輸出Member?name=Douglas?age=45的道理和上面相同.
          第五個輸出Member?name=Andy?age=20是因為changeMemberField函數(shù)中修改了參數(shù)member 的值,也就是修改member指向實例的值,而這個實例正是member指向的值,因此member就變成了name=Andy 且age=20.

          結論

          Java中參數(shù)傳遞的都是值,對應基本類型,傳遞的是原值的拷貝;對于類類型,傳遞的是引用即地址的拷貝.
          對于函數(shù)對參數(shù)的改變是否會影響原值的問題:值類型自然不會影響到原值.而對于類類型要看改變的是參數(shù)的地址還是值,如果是前者,參數(shù)和原引用指向了不同的地址,它們自然脫離了關系;如果是后者,修改的實例就是原引用指向的實例,這當然對原值進行了修改.

          代碼下載
          http://www.aygfsteel.com/Files/sitinspring/PassValueOrReference20080116142420.rar

          posted on 2008-06-27 13:55 超凡 閱讀(417) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 九龙城区| 微山县| 清远市| 凤凰县| 新绛县| 玛沁县| 张家界市| 天祝| 项城市| 蓬溪县| 苍梧县| 台南县| 石柱| 交口县| 扎赉特旗| 东宁县| 宁夏| 荃湾区| 云林县| 恩平市| 株洲市| 高州市| 灵石县| 隆子县| 保康县| 乌拉特后旗| 临海市| 汶川县| 弋阳县| 同心县| 清新县| 太保市| 九台市| 雅江县| 固原市| 祁连县| 曲阳县| 巴楚县| 大化| 台湾省| 淳化县|