java 板


LINE

※ 引述《tzk28419 (甲鳥)》之銘言: : 麻煩各位了 : 今天腦子打結 : 有關這個程式的輸出值 : public class Student{ : public int id; : } : public static void change(Student x){ : x.id=102; : } : public static void main (String[] args){ : Student s1=new Student(); : s1.id=101; : change(s1); : System.out.println(s1.id); : } : 如果Java中全部都是call by value來看的話 : 印出的結果應該是101才對 : 可是為什麼答案是102呢? : 而且在x.id=102;前面多加x=new Student();就會和我起先想的一樣是101 : 這兩者我以後要如何分別呢? : 流程是怎樣跑的? 看在推文中也有站友說不明白,我嘗試解釋一下。 首先,Java只有 pass-by-value (在這版戰過很多 次了,這說法連 JLS 自己也是這樣說,我不希望又 執著這個話題又有戰火了) 首先為免詞語混淆,我先把一個 Java 裡常用的字改 一改名。Java 裡常說到非 primitive type 的 var 就是 reference type。在這篇中我把這個名詞改為 Pointer (有 C/C++ 經驗的,就把它常成 C/C++ 裡 的 pointer 吧)。因為這個 "reference" 和 "pass by reference" 放在一起經常讓人眼花。 常說 Java 只有 Pass-by-value,而原 po 例子中, Student 明明沒有 pass-by-value,為什麼? 首先要記著,一個非 primitive 的 var, 它就是 pointer。 即是, Student s1=new Student(); 裡面,s1 本身不是一個 Student 的 Object, 它是 Student 的 Pointer, 它只是指向一個 Student 的 Object 而已。 明白了這,一切都好解說了。 change(s1) 的確是 pass-by-value。可是要記著,傳進 change() 的,不是一個 Student 的 Object,而是一個 Student 的 pointer,所以,被拷貝了一份的,是 pointer 而非 student 的 object. 用圖解說一下吧: 你的第一個情況 Student s1 = new Student() +------------+ s1 [0x12345678] ------------> | Student | | - id: 0 | +------------+ Student s1 = new Student() s1.id = 101; +------------+ s1 [0x12345678] ------------> | Student | | - id: 101 | +------------+ Student s1 = new Student() s1.id = 101; change(s1) change(x) { +------------+ s1 [0x12345678] ------------> | Student | +-> | - id: 101 | | +------------+ | x [0x12345678] ------------+ Student s1 = new Student() s1.id = 101; change(s1) change(Student x) { x.id = 102; +------------+ s1 [0x12345678] ------------> | Student | +-> | - id: 102 | | +------------+ | x [0x12345678] ------------+ Student s1 = new Student() s1.id = 101; change(s1) change(Student x) { x.id = 102; } s.id +------------+ s1 [0x12345678] ------------> | Student | +-> | - id: 102 | | +------------+ | x [0x12345678] ------------+ 完結後, s1.id 當然拿到 102. 好了,第二個情況,你加了 x = new Student(),到這步為 止和第一情況都一樣: Student s1 = new Student() s1.id = 101; change(s1) change(Student x) { +------------+ s1 [0x12345678] ------------> | Student | +-> | - id: 101 | | +------------+ | x [0x12345678] ------------+ Student s1 = new Student() s1.id = 101; change(s1) change(Student x) { x = new Student(); +------------+ s1 [0x12345678] ------------> | Student | | - id: 101 | +------------+ +------------+ x [0x98765432] -------------> | Student | | - id : 0 | +------------+ Student s1 = new Student() s1.id = 101; change(s1) change(Student x) { x = new Student(); x.id = 102; } +------------+ s1 [0x12345678] ------------> | Student | | - id: 101 | +------------+ +------------+ x [0x98765432] -------------> | Student | | - id : 102 | +------------+ change 完結後,s1 當然還是拿到 101 應該清楚了吧? Alien --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 223.19.42.175 ※ 編輯: adrianshum 來自: 223.19.42.175 (05/25 23:57)
1F:推 swpoker:只能推了 05/25 23:58
2F:推 wannawanna:推圖解說明 05/26 00:38
3F:推 andymai:其實講到pointer pass by value就該懂了~大大還用心畫了圖 05/26 07:26
4F:推 tzk28419:我懂了!!謝謝Alien!!超棒的圖!!!! 05/26 08:44
5F:推 kaocoming:推推!!!!! 05/26 09:34
6F:推 Expsun:用心給推! 05/26 10:05
7F:推 tails32100:推用心畫>< 05/26 10:10
8F:推 aiueoH:推~ 05/26 13:15
9F:→ aiueoH:不知道可否順便問一下 C# 是不是也是如此? 05/26 13:19
10F:推 fonz:畫圖畫的很用心XD~ 大推 05/26 15:34
11F:推 hotscott:推推!! 清楚~ 05/26 18:20
12F:推 KanoLoa:這類問題都會讓我慶幸以前C有學過point 05/26 19:46
13F:推 a88258850:感謝~ 05/26 22:06
14F:推 nhtyjm:用心推 05/27 00:16
15F:→ adrianshum:KanoLoa: 是 pointer, 不是 point 05/27 06:55
16F:→ adrianshum:aiueoH: 只看過 C# 的皮毛,C# 不是以 primitive/ref 05/27 06:56
17F:→ adrianshum:作分野,而是根據忘了什麼規定去決定傳的是 pointer 05/27 06:57
18F:→ adrianshum:還是obj 本身。不過只要傳的是 pointer, 概念也一樣 05/27 06:57
19F:推 KanoLoa:XD 05/27 08:40
20F:推 abola921:推! 少見的圖解法 05/27 10:17
21F:推 aiueoH:謝謝 adrianshum ~ 瞭解 05/27 10:49
22F:推 gmoz:清楚明白 05/27 12:41
23F:推 PsMonkey:樓上讓我想到《奪命金》 XD 05/27 12:57
24F:推 brianhsu:推圖解~ 05/27 14:47
25F:推 coolcomm:推 05/27 20:45
26F:→ swpoker:其實這個在j2se的官方教學書冊裡面就有了 05/28 13:36
27F:推 lsunyu:疑 第10頁上面第一個位置為什麼id拿到了102? 05/28 22:35
28F:推 issuemylove:pass-by-value 05/29 16:10
29F:推 lsunyu:可是第10頁不是還在x = new Student(); 階段 id=102? 05/30 00:46
30F:→ adrianshum:樓上:明顯是筆誤:P 改正中 06/01 22:43
※ 編輯: adrianshum 來自: 223.19.42.175 (06/01 22:45)
31F:推 cn1754:推 06/02 23:28
32F:推 qskyq0013:推推~ 06/11 20:25
33F:推 silentduke:好文 專業圖解 06/11 23:53
34F:推 moonjuice:謝謝解惑。很清楚!! 06/22 01:35
35F:推 kspacey:推 06/22 20:48







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP