首頁 > Java > java教程 > 主體

java參數的值傳遞和引用傳遞的介紹(附實例)

不言
發布: 2018-09-25 14:55:12
原創
2743 人瀏覽過

這篇文章帶給大家的內容是關於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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!