Java面試題:
當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?
答案基本上是:值傳遞
說明:得出這種結論的前提必須是“參數的值就是對該對象的引用,而不是對象的內容”
----------------------------------------------------
值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法中執行形式參數值的改變不影響實際參數的值。
引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(即地址,而不是參數的值)被傳遞給方法中相對應的形式參數,
在方法中執行對形式參數的操作實際上就是對實際參數的操作(地址操作),這樣方法執行中形式參數值的改變將會影響實際參數的值。
值傳遞——基礎資料型別 (Elementary Data Type)作為參數(如:String,int)
public static void changeInt(int a, int b){<br />int tmp;<br />tmp = a;<br />a = b;<br />b = tmp;<br />}參數調用:
// int類型,值傳遞<br />int a = 123;<br />int b = 456;</p><p>printInt(a, b);<br />changeInt(a, b);<br />printInt(a, b);執行結果:
a = 123; b = 456
a = 123; b = 456
----------------------------------------------------
引用傳遞——對象或數組作為參數(如:Person,Array)
class Person{<br />String name;<br />int age;</p><p>public Person(String name, int age){<br />this.name = name;<br />this.age = age;<br />}</p><p>public void changePerson(Person person, String name, int age){<br />person.name = name;<br />person.age = age;<br />}</p><p>public void printPerson(Person person){<br />System.out.println("name = " + person.name + "; age = " + person.age);<br />}<br />}參數調用:
// 對象,引用傳遞<br />Person p = new Person("張三", 20);</p><p>p.printPerson(p);<br />p.changePerson(p, "李四", 30);<br />p.printPerson(p);執行結果:
name = 張三; age = 20
name = 李四; age = 30
----------------------------------------------------
完整樣本:
package com.val_ref;</p><p>// Person類<br />class Person{<br />String name;<br />int age;</p><p>public Person(String name, int age){<br />this.name = name;<br />this.age = age;<br />}</p><p>public void changePerson(Person person, String name, int age){<br />person.name = name;<br />person.age = age;<br />}</p><p>public void printPerson(Person person){<br />System.out.println("name = " + person.name + "; age = " + person.age);<br />}<br />}</p><p>class iArray{</p><p>public iArray(){</p><p>}</p><p>public void reverseArray(int []array){<br />int tmp;<br />int len = array.length;<br />for(int i=0; i<len/2; i++){<br />tmp = array[i];<br />array[i]= array[len-1-i];<br />array[len-1-i] = tmp;<br />}<br />}</p><p>public void printArray(int []array){</p><p>for(int i=0; i<array.length; i++){<br />System.out.print(array[i] + " ");<br />}<br />System.out.println();<br />}<br />}</p><p>public class testValue {</p><p>public static void main(String []args){</p><p>// 對象,引用傳遞<br />Person p = new Person("張三", 20);</p><p>p.printPerson(p);<br />p.changePerson(p, "李四", 30);<br />p.printPerson(p);</p><p>// 對象,引用傳遞<br />int []array = new int[5];<br />for(int i=0; i<array.length; i++){<br />array[i] = i+1;<br />}<br />iArray obj = new iArray();<br />obj.printArray(array);<br />obj.reverseArray(array);<br />obj.printArray(array);</p><p>// String類型,值傳遞<br />String name1 = "張三";<br />String name2 = "李四";</p><p>printString(name1, name2);<br />changeString(name1, name2);<br />printString(name1, name2);</p><p>// int類型,值傳遞<br />int a = 123;<br />int b = 456;</p><p>printInt(a, b);<br />changeInt(a, b);<br />printInt(a, b);<br />}</p><p>// String類型<br />public static void changeString(String name1, String name2){<br />String tmpName;<br />tmpName = name1;<br />name1 = name2;<br />name2 = tmpName;<br />}</p><p>public static void printString(String name1, String name2){<br />System.out.println("name1 = " + name1 + "; name2 = " + name2);<br />}</p><p>// int類型<br />public static void changeInt(int a, int b){<br />int tmp;<br />tmp = a;<br />a = b;<br />b = tmp;<br />}</p><p>public static void printInt(int a, int b){<br />System.out.println("a = " + a + "; b = " + b);<br />}<br />}
執行結果:
name = 張三; age = 20
name = 李四; age = 30
1 2 3 4 5
5 4 3 2 1
name1 = 張三; name2 = 李四
name1 = 張三; name2 = 李四
a = 123; b = 456
a = 123; b = 456
推薦參考:
java中的值傳遞和引用傳遞
Java 是值傳遞還是引用傳遞
java參數傳遞時到底是值傳遞還是引用傳遞
Java 的==和Equals比較