[問題] Integer 如何pass-by-ref

看板java作者 (DONmilK)時間6年前 (2018/11/27 15:26), 編輯推噓0(006)
留言6則, 1人參與, 6年前最新討論串1/1
各位版上朋友好 小弟使用Java不久 最近被問到一個神奇的題目 void bar(Integer a, Integer b) { if(a != b) return; if(a > 200) return; a++; b++; b++; assert a < b; } 目的是要觸發assertion error 如果用c++可以讓兩個input指向同一個memory address來觸發 但java都是pass by value 不管怎樣a, b都會被當成不同的物件來處理 而因為第二個if的關係 不能傳入a=b=INT_MAX-1 來導致overflow 不知道有什麼解法呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 107.0.114.25 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1543303571.A.F20.html

11/27 16:35, 6年前 , 1F
Integer是個reference type,的確會pass by ref's value
11/27 16:35, 1F

11/27 16:46, 6年前 , 2F
所以傳同一個Integer進去就真的是同一個,問題是在Integer
11/27 16:46, 2F

11/27 16:47, 6年前 , 3F
是immutable,做a++其實會編譯成
11/27 16:47, 3F

11/27 16:50, 6年前 , 4F
a = Integer.valueOf(a.intValue()+1);
11/27 16:50, 4F

11/27 16:59, 6年前 , 5F
所以跑到最後一行時a b本來就不是原來的a b了
11/27 16:59, 5F

11/27 17:04, 6年前 , 6F
你自己試傳兩個new Integer(),在第一個if就會return了
11/27 17:04, 6F
文章代碼(AID): #1R_F6JyW (java)
文章代碼(AID): #1R_F6JyW (java)