這篇文章帶給大家的內容是關於java參數的值傳遞和引用傳遞的介紹(附實例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
值傳遞:方法呼叫時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參 數的值。
引用傳遞:也稱為傳送位址。方法呼叫時,實際參數的參考(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,方法執行中形式參數值的改變將會影響實際參數的值。
a.傳遞值的資料型態:八種基本資料型別和String(這樣理解可以,但是事實上String也是傳遞的位址,只是string物件和其他物件是不同的,string物件是不能被改變的,內容改變就會產生新物件。那麼StringBuffer就可以了,但只是改變其內容。不能改變外部變數所指向的記憶體位址)。
b.傳遞位址值的資料類型:除String以外的所有複合資料類型,包括陣列、類別和介面。
值傳遞的範例:
package com.other.test; public class Test { public static void change(int i, int j) { int temp = i; i = j; j = temp; } public static void main(String[] args) { int a = 3; int b = 4; change(a, b); System.out.println("a=" + a); System.out.println("b=" + b); } }
輸出的結果是a=3 b=4, 傳遞的值不會改變原值
引用傳遞的範例:(陣列)
package com.other.test; public class Test { public static void change(int[] counts) { counts[0] = 6; System.out.println(counts[0]); } public static void main(String[] args) { int[] count = { 1, 2, 3, 4, 5 }; change(count); System.out.println(count[0]); } }
輸出結果是6 6 也就是引用的值改變了原來的值引用傳遞的例子:(物件)
定義一個A物件:
package com.other.test; public class A { int i = 0; }
對上邊物件操作的類別:
package com.other.test; public class Test { public static void add(A a) { //a = new A(); ① a.i++; } public static void main(String args[]) { A a = new A(); add(a); System.out.println(a.i ); } }
當①註解掉時,輸出的結果是1,當①沒有註解是0,原因是a =new A();建構了新的A物件就不是傳遞的那個物件了。看看String的狀況
package com.other.test; public class Test { String str = new String("old"); char[] ch = { 'a', 'b', 'c' }; public static void main(String args[]) { Test ex = new Test(); ex.change(ex.str, ex.ch); System.out.print(ex.str + " and "); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = "new"; ch[0] = 'd'; } }
輸出的結果的是 old and dbc也就是傳遞String並不會改變原值,而是建立了一個新值。
ch[]就是一個簡單的陣列的傳遞。 ( 物件包括物件引用即地址和物件的內容) String 比較特別,看過String 程式碼的都知道, String 是 final的。所以值是不變的。函數中String物件引用的副本指向了另一個新String物件,而陣列物件所引用的副本沒有改變,而是改變物件中資料的內容.
對於物件類型,也就是Object的子類,如果你在方法中修改了它的成員的值,那個修改是生效的,方法調用結束後,它的成員是新的值,但是如果你把它指向一個其它的對象,方法呼叫結束後,原來對它的引用並沒用指向新的物件。
Java參數,不管是原始類型還是引用類型,傳遞的都是副本(有另外一種說法是傳值,但是說傳副本更好理解吧,傳值通常是相對傳址而言)。
如果參數類型是原始型,那麼傳過來的就是這個參數的一個副本,也就是這個原始參數的值,這個跟之前所談的傳值是一樣的。如果在函數中改變了副本的值不會改變原始的值. 如果參數類型是引用類型,那麼傳過來的就是這個引用參數的副本,這個副本存放的是參數的位址。如果在函數中沒有改變這個副本的位址,而是改變了位址中的值,那麼在函數內的改變會影響到傳入的參數。如果在函數中改變了副本的位址,如new一個,那麼副本就指向了一個新的位址,此時傳入的參數還是指向原來的位址,所以不會改變參數的值。
以上是java參數的值傳遞和引用傳遞的介紹(附實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!