<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    和風細雨

    世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

    Java中參數傳遞是傳值還是傳址?

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

    值傳遞是將要傳遞的值作為一副本傳遞.如
         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中函數參數的傳遞是值傳遞還是引用傳遞?

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

    例子代碼:

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

    結論

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

    代碼下載
    http://m.tkk7.com/Files/sitinspring/PassValueOrReference20080116142420.rar

    posted on 2008-02-22 09:19 和風細雨 閱讀(5020) 評論(6)  編輯  收藏

    評論

    # re: Java中參數傳遞是傳值還是傳址? [未登錄] 2008-08-05 17:45 劉浩

    哥們,謝謝了 你讓我徹底的弄懂了java里這個參數傳遞的事情  回復  更多評論   

    # re: Java中參數傳遞是傳值還是傳址? 2008-10-16 15:56 冶人

    引用傳遞,傳遞的是引用對象的內存地址
    int *p,*p1;
    int j=5; *p=j; //這里是把j在內存當中的地址賦給了指針p

    JAVA中有使用指針嗎?  回復  更多評論   

    # re: Java中參數傳遞是傳值還是傳址? [未登錄] 2009-03-05 13:57 我愛java

    收益啊
    總之一句話了,
    java中都是值傳遞的,也就是都是拷貝一份,相當于在內存中有個備份一樣的
    只不過有時是值的備份,有時地址的備份罷了,學習中  回復  更多評論   

    # re: Java中參數傳遞是傳值還是傳址? 2009-10-15 07:24

    第三個輸出有問題。要是在前面加個String a=“abcd”;然后value=a;輸出也是相同的。這又怎么說。  回復  更多評論   

    # re: Java中參數傳遞是傳值還是傳址? 2013-05-28 16:38 bo_hai

    總結的很不錯呀!!  回復  更多評論   

    # re: Java中參數傳遞是傳值還是傳址? 2014-02-07 11:07 又又

    很好,很受用,嘿嘿  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 猫咪www免费人成网站| 亚洲熟女乱色一区二区三区| 亚洲暴爽av人人爽日日碰| 亚洲无砖砖区免费| 香蕉蕉亚亚洲aav综合| 爽爽爽爽爽爽爽成人免费观看| 亚洲精品无码成人片在线观看| 国产精品亚洲lv粉色| 热99re久久免费视精品频软件| 亚洲国产亚洲综合在线尤物| 野花高清在线电影观看免费视频| 久久精品国产亚洲AV无码偷窥| 一级毛片免费观看| 亚洲最大免费视频网| 久久久久久国产a免费观看黄色大片| 久久夜色精品国产噜噜噜亚洲AV| 青青草原1769久久免费播放| 久久久久亚洲av无码专区| 福利免费观看午夜体检区| 亚洲最大的成人网| 亚洲成人国产精品| 13小箩利洗澡无码视频网站免费 | 免费一级国产生活片| 久久久精品视频免费观看| 亚洲AV无码久久精品蜜桃| 久久综合国产乱子伦精品免费| 亚洲免费电影网站| 四虎永久免费地址在线观看| 久久国产福利免费| 亚洲精品人成电影网| 国产免费牲交视频| 两个人日本WWW免费版| 亚洲激情黄色小说| 又粗又大又硬又爽的免费视频| 成在人线av无码免费高潮水| 久久久亚洲裙底偷窥综合| 热99re久久精品精品免费| 中文字幕在线免费观看视频| 亚洲二区在线视频| 亚洲国产精品专区在线观看| 99re在线精品视频免费|