什么是值傳遞?什么是引用傳遞?
值傳遞是將要傳遞的值作為一副本傳遞.如
int i=4;
int j=i;
這里相當(dāng)于把14復(fù)制了一個(gè)副本給j,結(jié)果是i=4,j=4
引用傳遞,傳遞的是引用對(duì)象的內(nèi)存地址
int *p,*p1;
int j=5; *p=j; //這里是把j在內(nèi)存當(dāng)中的地址賦給了指針p
p1=p; //這里是把指針p中保存的地址(就是j的地址)賦給了指針p1
j=4; //這里改變j的值 輸出結(jié)果是 j=4 , *p=4 , *p1=4 //因?yàn)閜和p1指向的都是j 所以他們的值隨j值改變
(以上說明和代碼來自http://zhidao.baidu.com/question/31191252.html)
Java中函數(shù)參數(shù)的傳遞是值傳遞還是引用傳遞?
Java中參數(shù)傳遞時(shí)傳遞到函數(shù)中的參數(shù)都是原變量的一份拷貝,對(duì)于非類類型如int,float等,這份拷貝自然和原變量脫離了關(guān)系,這不難理解;
而對(duì)于類的實(shí)例而言,這份拷貝恰巧是實(shí)例引用的拷貝,它(參數(shù))指向的實(shí)例地址和原實(shí)例引用指向的實(shí)例地址都是一樣的,因此對(duì)參數(shù)的修改有時(shí)也會(huì)影響到實(shí)例本身,故此造成了Java傳遞類實(shí)例是傳遞的引用即地址的假象,如下面例子中的changeMemberField函數(shù),但是我們把參數(shù)指向的地址改到別的實(shí)例上時(shí),如changeMember函數(shù),我們會(huì)發(fā)現(xiàn)參數(shù)和原實(shí)例引用再也不會(huì)發(fā)生關(guān)系了,這里證明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
解釋:
第一個(gè)輸出10是因?yàn)閕nt是基本類型,傳遞的參數(shù)是intValue的拷貝,對(duì)拷貝的修改對(duì)原值intValue沒有影響.
第一個(gè)輸出10和上面是一個(gè)道理.
第三個(gè)輸出1234.由于String是類類型, str是stringValue的地址拷貝,參數(shù)str指向的地址和stringValue的一致,但在函數(shù)changeString 中,由于String的特殊性, str=“5555”和str=new String(“5555”)是等價(jià)的, str指向了新的”5555”所在的地址,此句后str就與原來的stringValue徹底脫離了聯(lián)系.
第四個(gè)輸出Member?name=Douglas?age=45的道理和上面相同.
第五個(gè)輸出Member?name=Andy?age=20是因?yàn)閏hangeMemberField函數(shù)中修改了參數(shù)member 的值,也就是修改member指向?qū)嵗闹?而這個(gè)實(shí)例正是member指向的值,因此member就變成了name=Andy 且age=20.
結(jié)論
Java中參數(shù)傳遞的都是值,對(duì)應(yīng)基本類型,傳遞的是原值的拷貝;對(duì)于類類型,傳遞的是引用即地址的拷貝.
對(duì)于函數(shù)對(duì)參數(shù)的改變是否會(huì)影響原值的問題:值類型自然不會(huì)影響到原值.而對(duì)于類類型要看改變的是參數(shù)的地址還是值,如果是前者,參數(shù)和原引用指向了不同的地址,它們自然脫離了關(guān)系;如果是后者,修改的實(shí)例就是原引用指向的實(shí)例,這當(dāng)然對(duì)原值進(jìn)行了修改.
代碼下載:
http://www.aygfsteel.com/Files/sitinspring/PassValueOrReference20080116142420.rar