Java中只有值傳遞
阿新 • • 發佈:2021-01-19
在Java中只有值傳遞。
值傳遞(pass by value)是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。
引用傳遞(pass by reference)是指在呼叫函式時將實際引數的地址直接傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。
值傳遞中有幾個例子,先一一的解釋一下。
- 數值型別
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這個變數。
- 物件
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'}
- 字串物件
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
感謝此文章的幫助