值傳遞與引用傳遞
最近學基礎的時候,老師講了值傳遞和引用傳遞,這個問題一直不太明白,上網查了很多資料,按照自己的理解整理了一遍,發現之前不太明白的地方基本上想明白了,如有不正確的地方,歡迎指正,謝謝。
首先要說明的是java中是沒有指針的,java中只存在值傳遞,只存在值傳遞!!! 然而我們經常看到對於對象(數組,類,接口)的傳遞似乎有點像引用傳遞,可以改變對象中某個屬性的值。但是不要被這個假象所蒙蔽,實際上這個傳入函數的值是對象引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。
值傳遞
示例:
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。傳遞的是值得一份拷貝,這份拷貝與原來的值沒什么關系。
內存分析:
引用傳遞
示例:
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]); } }
顯然輸出結果為10 50。實際傳遞的是引用的地址值。
內存分析:
示例:
class Emp { public int age; } public class Test { public static void change(Emp emp) { emp.age = 50; emp = new Emp();//再創建一個對象 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.
內存分析:
對於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修飾的,不可變,它會在內存中在開辟一塊新空間。
注:如有不正確的地方歡迎指正,謝謝