1、對(duì)于基本類型,傳遞值
2、對(duì)于對(duì)象類型,傳遞對(duì)象引用
需要注意的是:對(duì)于上述兩種傳遞類型,在傳遞時(shí)都是拷貝傳遞,即值傳遞時(shí)拷貝出一個(gè)新值,引用
傳遞時(shí)拷貝出一個(gè)新的拷貝。
有時(shí)候也說Java只有值傳遞,意思是對(duì)于引用類型,傳遞引用的值。一個(gè)概念,不用糾纏。
在內(nèi)存中對(duì)象類型可以看做兩塊,一塊是對(duì)象的引用,一塊是數(shù)據(jù)區(qū)。引用塊里面保存了數(shù)據(jù)區(qū)的地址。
看如下示例代碼:
1 public class Test {
2
3 public static void main(String[] args) {
4 // 值傳遞
5 int i = 1;
6 addInt1(i);
7 System.out.println(i);// 輸出1
8 addInt2(i);
9 System.out.println(i);// 輸出1
10
11 // 引用傳遞實(shí)例1
12 String str = "123";
13 modifyStr1(str);
14 System.out.println(str);// 輸出123
15
16 // 引用傳遞實(shí)例2
17 StringBuilder stringBuilder = new StringBuilder("123");
18 modifyStringBuilder(stringBuilder);
19 System.out.println(stringBuilder.toString());// 輸出123456
20 }
21
22 // 拷貝了新的值,原值不變
23 public static void addInt1(int i) {
24 i = 2;
25 }
26
27 // 拷貝了新的值,原值不變
28 public static void addInt2(int i) {
29 i++;
30 }
31
32 // 新的拷貝引用指向了一塊新數(shù)據(jù)區(qū),原拷貝仍然指向原數(shù)據(jù)區(qū)
33 public static void modifyStr1(String str) {
34 str = "456";
35 }
36
37 // 新的拷貝引用仍然指向原數(shù)據(jù)區(qū),但修改了原數(shù)據(jù)區(qū)的內(nèi)容
38 public static void modifyStringBuilder(StringBuilder str) {
39 str.append("456");
40 }
41
42 }
2
3 public static void main(String[] args) {
4 // 值傳遞
5 int i = 1;
6 addInt1(i);
7 System.out.println(i);// 輸出1
8 addInt2(i);
9 System.out.println(i);// 輸出1
10
11 // 引用傳遞實(shí)例1
12 String str = "123";
13 modifyStr1(str);
14 System.out.println(str);// 輸出123
15
16 // 引用傳遞實(shí)例2
17 StringBuilder stringBuilder = new StringBuilder("123");
18 modifyStringBuilder(stringBuilder);
19 System.out.println(stringBuilder.toString());// 輸出123456
20 }
21
22 // 拷貝了新的值,原值不變
23 public static void addInt1(int i) {
24 i = 2;
25 }
26
27 // 拷貝了新的值,原值不變
28 public static void addInt2(int i) {
29 i++;
30 }
31
32 // 新的拷貝引用指向了一塊新數(shù)據(jù)區(qū),原拷貝仍然指向原數(shù)據(jù)區(qū)
33 public static void modifyStr1(String str) {
34 str = "456";
35 }
36
37 // 新的拷貝引用仍然指向原數(shù)據(jù)區(qū),但修改了原數(shù)據(jù)區(qū)的內(nèi)容
38 public static void modifyStringBuilder(StringBuilder str) {
39 str.append("456");
40 }
41
42 }