Java String 值傳遞 VS 引用傳遞
阿新 • • 發佈:2017-07-26
oid 基本類 一個 span 類型 字符 this pub str
在Java代碼中,如果方法參數中有String類型,那麽這個參數是值傳遞還是方法傳遞呢?
基本類型容易理解,對象類型也容易理解,可偏偏String這個對象類型讓人有些疑惑。別著急,看完你就清晰了。
其實,我們大可不必糾結於文字遊戲,在Java中宣稱只有值傳遞,而在C++程序員來看要區分為值傳遞和引用/指針傳遞,實質上是一致的。
1. 對於基本類型,如int、char,大家都能理解,屬於值傳遞,一個方法中對於基本類型的修改,不會反饋到方法調用者。
public static void main(String[] args) { int a = 111; change(a); System.out.println("in method main, a = " + a); } private static void change(int a) { a = 789; System.out.println("in method change, a = " + a); }
輸出:
in method change, a = 789
in method main, a = 111
2. 對於對象類型,值傳遞,傳遞的是對象的地址,而不是對象的內容。所以,在方法內只要不修改對象的地址,那麽對象內容的修改就會反饋到方法調用者,因為方法內外見到的是同一個地址。
public static void main(String[] args) { Student studentA = new Student(); studentA.age = 18; change(studentA); System.out.println("in method main, age = " + studentA.age); } private static void change(Student student) { student.age= 46; System.out.println("in method change, age = " + student.age); } private static class Student { private int age; /** * 取得age * @return 返回 age */ public int getAge() { return age; } /** * 設置age * @param age 要設置的age */ public void setAge(int age) { this.age = age; } }
輸出:
in method change, age = 46
in method main, age = 46
3. 接著第2條說,如果參數是對象類型,但是在方法內,參數重新指向了別的對象,即參數的地址發生了變化。那麽對這個參數的修改將不會反饋到方法調用者,因為方法內外見到的不是同一個地址。
public static void main(String[] args) { Student studentA = new Student(); studentA.age = 18; change(studentA); System.out.println("in method main, age = " + studentA.age); } private static void change(Student student) { student = new Student(); student.age = 46; System.out.println("in method change, age = " + student.age); }
輸出:
in method change, age = 46
in method main, age = 18
4. String類型。為什麽String類型作為參數傳遞,修改String不能反饋到方法調用者呢?因為在Java中有個常量池,每個字符串都對應常量池中的一個對象,也就是說,如果對String對象重新賦值,就相當於將String指向了另一個對象,地址發生了改變。下面兩端代碼是等效的。
代碼一:
public static void main(String[] args) { String str = "111"; change(str); System.out.println("in method main, str = " + str); } private static void change(String str) { str = "222"; System.out.println("in method change, str = " + str); }
代碼二:
public static void main(String[] args) { String str = new String("111"); change(str); System.out.println("in method main, str = " + str); } private static void change(String str) { str = new String("222"); System.out.println("in method change, str = " + str); }
輸出都一樣:
in method change, str = 222
in method main, str = 111
Java String 值傳遞 VS 引用傳遞