1. 程式人生 > 實用技巧 >Java中只有值傳遞

Java中只有值傳遞

在Java中只有值傳遞。

值傳遞(pass by value)是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。

引用傳遞(pass by reference)是指在呼叫函式時將實際引數的地址直接傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。

值傳遞中有幾個例子,先一一的解釋一下。

  1. 數值型別
public static void main(String[] args) {
   ParamTest pt = new ParamTest();

   int i = 10;
   pt.pass(i );
   System.out.println("print in main , i is " + i);
}

public void pass(int j) {
   j = 20;
   System.out.println("print in pass , j is " + j);
}

輸出:

print in pass , j is 20
print in main , i is 10

在這個例子中,j的改變沒有影響到i這個變數。

  1. 物件
public static void main(String[] args) {
   ParamTest pt = new ParamTest();

   User hollis = new User();
   hollis.setName("Hollis");
   hollis.setGender("Male");
   pt.pass(hollis);
   System.out.println("print in main , user is " + hollis);
}

public void pass(User user) {
   user.setName("hollischuang");
   System.out.println("print in pass , user is " + user);
}

這個輸出

print in pass , user is User{name='hollischuang', gender='Male'}
print in main , user is User{name='hollischuang', gender='Male'}
  1. 字串物件
public static void main(String[] args) {
   ParamTest pt = new ParamTest();

   String name = "Hollis";
   pt.pass(name);
   System.out.println("print in main , name is " + name);
}

public void pass(String name) {
   name = "hollischuang";
   System.out.println("print in pass , name is " + name);
}

這個輸出

print in pass , name is hollischuang
print in main , name is Hollis

有人會說,第2個例子改變了不就是引用傳遞嗎,並不是。綜合2和3的例子來看

在例子2中

實際上,這個並沒有直接傳遞地址,而是兩個不同的物件,指向同一個引用。在main中的hollis是一個物件,他有自己的地址,值是一個引用;在pass方法中的user又是另一個物件,他也有自己的地址(和hollis的地址不一樣),他的值也是一個引用。從main中傳遞到pass中,是hollis的值(一個引用)賦給user的值(一個引用)。並沒有直接將hollis的地址賦值給user。所以還是值傳遞,只不過這個值是一個引用。當修改user時,實際修改了引用中的內容,那麼hollis中引用的物件中的內容自然也會變。

在例子3中

這裡main中沒有改變是因為賦值了一個新的物件給user,user指向了一個新的引用(String的性質),而不是修改了原引用中的值,所以user的改變沒有影響到main中的物件。如果第3個例子中把String換成StringBuilder,並使用append方法,那麼引用就不會改變,得到的結果就類似於例子2。

演示:

public static void main(String[] args) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("hello");
    change(stringBuilder);
    System.out.println(stringBuilder.toString());
}

public static void change(StringBuilder stringBuilder) {
    stringBuilder.append(",world");
    System.out.println(stringBuilder.toString());
}
hello,world
hello,world

感謝此文章的幫助