看板 java 關於我們 聯絡資訊
各位版上朋友好 小弟使用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
ssccg: Integer是個reference type,的確會pass by ref's value 11/27 16:35
ssccg: 所以傳同一個Integer進去就真的是同一個,問題是在Integer 11/27 16:46
ssccg: 是immutable,做a++其實會編譯成 11/27 16:47
ssccg: a = Integer.valueOf(a.intValue()+1); 11/27 16:50
ssccg: 所以跑到最後一行時a b本來就不是原來的a b了 11/27 16:59
ssccg: 你自己試傳兩個new Integer(),在第一個if就會return了 11/27 17:04