天天看點

java方法的傳遞_關于Java方法的參數傳遞

我們都知道,函數或者方法在傳遞參數的時候,大緻可以分為兩類:

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操作符操作成功後總會在記憶體中新開辟一塊存儲區域。相當于生成了一個新的引用。是以,這和對象類型傳遞引用并不沖突。

綜上所述:

對于基本資料類型來說 “=”指派操作是直接改變記憶體位址(存儲單元)上的值。在傳遞參數時,傳遞的是值。

對于對象類型來說 “=” 指派操作是改變引用變量所指向的記憶體位址。在傳遞參數時,傳遞的是位址(引用)。