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

來源:互聯網
上載者:User

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


值傳遞是將要傳遞的值作為一副本傳遞.如
     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://www.blogjava.net/junglesong/archive/2008/02/22/181246.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.