首先铆遭,java中只有值傳遞嗎硝桩?
其實(shí)有些人認(rèn)為有,有些人認(rèn)為沒有枚荣,各有各的道理
怎么理解呢碗脊?
java中傳遞對(duì)象做為參數(shù)時(shí),實(shí)際上傳遞的只是這個(gè)對(duì)象引用的一個(gè)拷貝棍弄,讀起來可能有點(diǎn)難以理解望薄,這里看個(gè)例子:
public class Example {
String account = "hello";
public static void main(String[] args) {
// TODO Auto-generated method stub
Example e = new Example();
e.change(e);
System.out.print(e.account);
}
void change(Example e){
e.account="hello1";
}
}
這里的輸出是hello1,和我們所預(yù)期的一樣呼畸,可能這里我們會(huì)覺得這不就是引用傳遞嗎:壑А!其實(shí)這里傳遞的只是Example對(duì)象引用的一個(gè)拷貝蛮原,聽名字卧须,只是個(gè)拷貝,自然與原引用不相干了儒陨。只是這兩個(gè)引用指向的內(nèi)容一樣花嘶,所以我們改變內(nèi)容的時(shí)候,原對(duì)象的內(nèi)容也跟著變了蹦漠!
再看一個(gè)例子:
public class Example {
String account = "hello";
public static void main(String[] args) {
// TODO Auto-generated method stub
Example e = new Example();
e.change(e.account);
System.out.print(e.account);
}
void change(String a){
a="hello1";
}
}
這里輸出是hello 椭员,可以發(fā)現(xiàn),這次account值沒有被改變了笛园,為什么呢隘击?
其實(shí)這里傳遞的也是對(duì)象引用的拷貝,只是這里傳遞的是個(gè) String對(duì)象:account對(duì)象引用的拷貝 a研铆,可以看到埋同,在change方法中 a 指向了“hello1”,這時(shí)候相當(dāng)于a 和account 這兩個(gè)引用分別指向了不同的內(nèi)容棵红,這時(shí)候a引用所指向的內(nèi)容變了凶赁,自然跟account所指向的內(nèi)容沒有任何關(guān)系了!
最后總結(jié)一下逆甜,為什么當(dāng)傳遞對(duì)象做為參數(shù)時(shí)虱肄,這么像是引用傳遞!
這是因?yàn)閭鬟f的是引用的拷貝交煞,如果你不將這個(gè) 冒牌貨 指向一個(gè)新的內(nèi)容(對(duì)象)咏窿,那么他指向的對(duì)象還是原來那個(gè)呀!那當(dāng)你去操作這個(gè)引用所指的對(duì)象其實(shí)還是在操作原有的內(nèi)容错敢。