1. 程式人生 > >java String 值傳遞 還是引用傳遞

java String 值傳遞 還是引用傳遞

值傳遞與引用傳遞

最近學基礎的時候,老師講了值傳遞和引用傳遞,這個問題一直不太明白,上網查了很多資料,按照自己的理解整理了一遍,發現之前不太明白的地方基本上想明白了,如有不正確的地方,歡迎指正,謝謝。

首先要說明的是java中是沒有指標的,java中只存在值傳遞,只存在值傳遞!!!  然而我們經常看到對於物件(陣列,類,介面)的傳遞似乎有點像引用傳遞,可以改變物件中某個屬性的值。但是不要被這個假象所矇蔽,實際上這個傳入函式的值是物件引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞

 值傳遞

    示例:

複製程式碼
public class Test {
    public static
void changeStri(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 Test {
    
public static void changeString(int []a){ a[0]=5; } public static void main(String[] args) { int []a={10,20}; System.out.println(a[0]);
        changeString(a);
System.out.println(a[0]); }} 複製程式碼

顯然輸出結果為10   5。實際傳遞的是引用的地址值。

記憶體分析:

            

 示例:

複製程式碼
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 String的變數是通過指向記憶體中的一個String物件,呼叫方法時請注意這裡是新建了一個String變數的拷貝 並不是String變數本身

注:如有不正確的地方歡迎指正,謝謝