看板 java 關於我們 聯絡資訊
※ 引述《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)
hate9527:如果people不new 用set get 結果似乎會不一樣 04/14 13:54
pa015596:謝謝大大詳細的解說 04/14 14:00
awert:@hate9527 > 用setter當然會不一樣 04/14 14:04
hate9527:我是提醒提問人呀 04/14 17:29
forthewill:推..原po真熱心 04/15 02:03
Chrisshan:熱心給推! 04/29 22:43