關於Java 值傳遞和引用傳遞。
先上代碼:
public class JavaTest { private int paraInt = 10; public int getParaInt() { return paraInt; } public void setParaInt(int paraInt) { this.paraInt = paraInt; } public void tryChangeBasicData(int para){ para = 100; System.out.println("inner tryChangeBasicData method:para = " + para); } public void tryChangeObject(JavaTest jTest){ jTest.setParaInt(100); System.out.println("inner tryChangeObject method:para = " + jTest.getParaInt()); } public static void main(String[] args) { JavaTest jTest = new JavaTest(); System.out.println("基本數據類型作為參數傳遞"); System.out.println("before method: " + jTest.getParaInt()); jTest.tryChangeBasicData(jTest.getParaInt()); System.out.println("after method: " + jTest.getParaInt()); System.out.println(""); System.out.println("對象引用作為參數傳遞"); System.out.println("before method: " + jTest.getParaInt()); jTest.tryChangeObject(jTest); System.out.println("after method: " + jTest.getParaInt()); } }
輸出:
基本數據類型作為參數傳遞 before method: 10 inner tryChangeBasicData method:para = 100 after method: 10 *** 對象引用作為參數傳遞 before method: 10 inner tryChangeObject method:para = 100 after method: 100
是按值傳遞,實際上是對傳入的基本數據類型參數A 做了一個值拷貝B,然後所有操作是針對這個拷貝B 的,因此不會影響到原參數A。
比如上面代碼中,tryChangeBasicData() 方法前後 paraInt 值並沒有改變。
是引用傳遞,實際上是對傳入引用X 做了一個拷貝引用Y,傳入引用X 和拷貝引用Y 指向同一個地址。
上面代碼中,tryChangeObject() 方法對拷貝引用Y 指向的地址空間內的變量進行修改,所以傳入引用X 取得的變量值是修改後的值。
究竟是按值傳遞還是按引用傳遞,這點不重要,因為不同的人對這兩個定義的理解不一樣。
真正需要明白的是:
String 在方法中作為參數傳遞,我們不用考慮傳遞的是引用還是值得拷貝,因為 String 本身一旦定義了就不可修改,做了“修改”(比如使用連接符做拼接)後就變成另外一個對象了,不會影響原對象。
所以當提起 Java 語言是值傳遞還是引用傳遞的時候,不妨換個理解方式,那就是傳過去的對象或引用會不會影響原對象。