我們都知道,函數或者方法在傳遞參數的時候,大緻可以分為兩類:
1.傳遞參數的值。
也就是說在方法内部改變參數時,系統會申請新的記憶體空間來拷貝參數的值。無論在内部怎麼進行指派操作,改變的都隻是這個拷貝的參數的值。而原來的參數并不會發生改變。
2.傳遞參數的位址(引用)
這種方式,會直接将參數的引用傳遞給方法。方法則可以根據這個引用直接通路到原參數的位址。在方法内部進行指派操作時,原參數的值也會随之改變。
那麼在Java中,方法參數的傳遞時哪一種呢?
public classTest1 {public static voidmain(String[] args) {int n = 3;
System.out.println("Before change, n = " +n);
changeData(n);
System.out.println("After changeData(n), n = " +n);
}public static void changeData(intnn) {
n= 10;
}
}
輸出結果為
```java
Before change, n = 3
After changeData(n), n = 3
```
**由以上例子可以看出,當參數為基本類型時,采用的是值傳遞的方式**
那麼,當參數為對象時又當如何呢?我們再來看一個例子
```java
public class Test2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf.append("World!");
}
}
```
輸出結果為
```java
Before change, sb = Hello
After changeData(n), sb = Hello World!
```
兩次的結果不一樣,說明原參數位址中的值發生了改變。足以證明,在上述的例子中傳遞的是參數的引用。
那麼是不是就可以說明對象類型傳遞的就是引用呢?我們再來看一個例子。
```java
public class Test3 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf = new StringBuffer("Hi ");
strBuf.append("World!");
}
}
```
如果是将參數的引用傳遞過去了,那麼就應該輸出以下結果:
```java
Before change, sb = Hello
After changeData(n), sb = Hi World!
```
然後實際的結果卻是
```java
Before change, sb = Hello
After changeData(n), sb = Hello
```
上面這個例子原參數的值并沒有被改變。是因為**new**關鍵字的作用。
在使用了new過後,strBuf中存放的不再是指向“Hello”的位址,而是指向“Hi ”的位址了,new操作符操作成功後總會在記憶體中新開辟一塊存儲區域。相當于生成了一個新的引用。是以,這和對象類型傳遞引用并不沖突。
綜上所述:
對于基本資料類型來說 “=”指派操作是直接改變記憶體位址(存儲單元)上的值。在傳遞參數時,傳遞的是值。
對于對象類型來說 “=” 指派操作是改變引用變量所指向的記憶體位址。在傳遞參數時,傳遞的是位址(引用)。