當然要看你怎麼定義by value 和 by reference。Java的官方文檔【3】
中如此描述:“When the method or constructor is invoked, the values of the actual argument expressions initialize newly created parameter variables.”但是作為物件導向的語言,一個對象的值又是什麼呢?所以這裡value並不等同於面向過程中的定義。在C語言裡,或者是一個值,或者就是一個地址(引用)。但是Java裡面,對象的值,就是對象的地址的值(具體見後面的例子)。
基本總結:
基本類型作為參數傳遞時,是傳遞值的拷貝,無論你怎麼改變這個拷貝,原值是不會改變的。
對象作為參數傳遞時,是把對象在記憶體中的地址拷貝了一份傳給了參數。
String類是個特殊的類,對它的一些操作符是重載的,所以String對象和基本類型一樣,一般情況下作為參數傳遞。
例子:
public class parameterPass {<br />public static void Test1(){<br />int i = 10;<br />System.out.println("Before change, i = " + i);<br />changeInt(i);<br />System.out.println("After change, i = " + i);<br />}</p><p>public static void changeInt(int i){<br />i = 20;<br />}</p><p>public static void Test2() {<br />Person p1 = new Person();<br />p1.setAge(10);<br />System.out.println("Before change, p1 age = " + p1.getAge());<br />changeAge(p1);<br />System.out.println("After change, p1 age = " + p1.getAge());<br />}<br />public static void changeAge(Person person) {<br />person.setAge(20);<br />}</p><p>public static void Test3(){<br />String str = "Hello";<br />System.out.println("Before change, str = " + str);<br />changeString(str);<br />System.out.println("After change, str = " + str);<br />}</p><p>public static void changeString(String str){<br />str = str + " World!";<br />}<br />public static void Test4(){<br />Integer i = new Integer(10);<br />System.out.println("Before change, i = " + i);<br />changeInteger(i);<br />System.out.println("After change, i = " + i);<br />}</p><p>public static void changeInteger(Integer i){<br />i = 20;<br />}</p><p>public static void main(String[] args) {<br />System.out.println("Test pass primitive data type: int");<br />Test1();<br />System.out.println("/nTest pass user defined object: Person");<br />Test2();<br />System.out.println("/nTest pass object type: String");<br />Test3();<br />System.out.println("/nTest pass object type: Integer");<br />Test4();<br />}<br />}<br />class Person {<br />int age;<br />public int getAge() {<br />return age;<br />}<br />public void setAge(int age) {<br />this.age = age;<br />}<br />}<br />
參考:
【1】http://java.ccidnet.com/art/3737/20050527/472879_1.html
【2】http://javadude.com/articles/passbyvalue.htm
【3】http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.1