值傳遞與引用傳遞 最近學(xué)基礎(chǔ)的時(shí)候,老師講了值傳遞和引用傳遞,這個(gè)問(wèn)題一直不太明白,上網(wǎng)查了很多資料,按照自己的理解整理了一遍,發(fā)現(xiàn)之前不太明白的地方基本上想明白了,如有不正確的地方,歡迎指正,謝謝。 首先要說(shuō)明的是java中是沒(méi)有指針的,java中只存在值傳遞,只存在值傳遞?。。? 然而我們經(jīng)??吹綄?duì)于對(duì)象(數(shù)組,類,接口)的傳遞似乎有點(diǎn)像引用傳遞,可以改變對(duì)象中某個(gè)屬性的值。但是不要被這個(gè)假象所蒙蔽,實(shí)際上這個(gè)傳入函數(shù)的值是對(duì)象引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。
值傳遞 示例: public class Test3 { public static void change(int a){ a=50; } public static void main(String[] args) { int a=10; System.out.println(a); change(a); System.out.println(a); } } 很顯然輸出的 是10,10。傳遞的是值得一份拷貝,這份拷貝與原來(lái)的值沒(méi)什么關(guān)系。 內(nèi)存分析:
引用傳遞 示例: public class Test3 { public static void change(int []a){ a[0]=50; } public static void main(String[] args) { int []a={10,20}; System.out.println(a[0]); change(a); System.out.println(a[0]); } } 顯然輸出結(jié)果為10 50。實(shí)際傳遞的是引用的地址值。 內(nèi)存分析:
示例: class Emp { public int age; } public class Test { public static void change(Emp emp) { emp.age = 50; emp = new Emp();//再創(chuàng)建一個(gè)對(duì)象 emp.age=100; } public static void main(String[] args) { Emp emp = new Emp(); emp.age = 100; System.out.println(emp.age); change(emp); System.out.println(emp.age); System.out.println(emp.age); } } 輸出為:100 50 50. 內(nèi)存分析:
對(duì)于String類: public class Test { public static void change(String s){ s="zhangsan"; } public static void main(String[] args) { String s=new String("lisi"); System.out.println(s); change(s); System.out.println(s); } } 輸出為:lisi lisi,由于String類是final修飾的,不可變,它會(huì)在內(nèi)存中在開(kāi)辟一塊新空間。
注:如有不正確的地方歡迎指正,謝謝
|
|
來(lái)自: terryecnu > 《易混淆知識(shí)歸類》