※ 引述《pa015596 (sdfgdgf)》之銘言:
: 當在main呼叫reverse(data)時 data這個陣列的值卻沒被修改
: 請教大大為何str=str2這行指令不能將結果修改到data
Java 永遠是 pass-by-value。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.1
When the method or constructor is invoked (§15.12), the values of the actual
argument expressions initialize newly created parameter variables, ...
也就是說,當 method, constructor 被呼叫時,裡面的 parameter variable 是新建出來
的參數,而不是 reference 本身。
看一下這個例子
public static void main(String[] args) {
People mary = new People("Mary");
transfer(mary);
System.out.println(mary.getName()); // still Mary, not John
}
private static void transfer(People p) {
p = new People("John");
}
為什麼不會變 ? 讓我們看一下實際發生的事
People mary = new People("Mary");
mary 0xAABBCC
------------- -----------------
| 0xAABBCC | ------------> | People("Mary")|
------------- -----------------
transfer(mary);
mary 0xAABBCC
-------------- -----------------
| 0xAABBCC | ------------> | People("Mary")|
-------------- -----------> -----------------
p /
--------------/
| 0xAABBCC |
--------------
當 transfer 被呼叫時,parameter p 不是 mary, 而是 mary 的複製品。
因此當執行到 p = new People("John") 時
mary 0xAABBCC
-------------- -----------------
| 0xAABBCC | ------------> | People("Mary")|
-------------- -----------------
p 0x112233
-------------- -----------------
| 0x112233 | ------------> | People("John")|
-------------- -----------------
這就是實際發生的事。參數 p 被指向了 John,但是參數 mary 仍然指向 Mary。
System.out.println(mary.getName())
mary 0xAABBCC
-------------- -----------------
| 0xAABBCC | ------------> | People("Mary")| ==> 印出 Mary
-------------- -----------------
==========================================================
這樣子你應該可以理解為什麼 str1 = str2 不會達到你要的效果。
--
We who cut mere stones must always be envisioning cathedrals.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.39.55.118
※ 編輯: awert 來自: 114.39.55.118 (04/14 13:30)
推
04/14 13:54, , 1F
04/14 13:54, 1F
推
04/14 14:00, , 2F
04/14 14:00, 2F
→
04/14 14:04, , 3F
04/14 14:04, 3F
推
04/14 17:29, , 4F
04/14 17:29, 4F
→
04/15 02:03, , 5F
04/15 02:03, 5F
推
04/29 22:43, , 6F
04/29 22:43, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):