看板 java 關於我們 聯絡資訊
gn00742754:然而,String不是也是物件嗎?可是他卻沒有這樣的問題07/13 00:12
coolcomm:因為Java的String是immutable07/13 01:05
如同 coolcomm 大所說 Java 的 String 是 immutable,所以不會有這個問題, 下面用圖解的方式說明差異: ======================================================== class Foo{ private String fooStr="颱風"; private int[] fooArr=int[1]; public String getString(){ return fooStr; } public int[] getArray(){ return fooArr; } } public static void main(String[] args){ int[] array=new int[1]; String str="哭哭"; Foo f=new Foo(); str=f.getString(); array=g.getArray(); array[0]=1; str="囧囧"; } =============================================================== [ Main method line by line ] int[] array=new int[1]; ╭─────╮ array ───→ │ int[1] │ ╰─────╯ ------ String str="哭哭"; ╭─────╮ array ───→ │ int[1] │ ╰─────╯ ╭────╮ str ────→│ "哭哭" │ ╰────╯ ----- Foo f=new Foo();───╮ ┌──── f ╭─────╮ │int[1]│←┐ ↓ array ───→ │ int[1] │ ╰───╯ │╭─────╮ ╰─────╯ └┼─fooArr │ ╭────╮ │ │ str ────→│ "哭哭" │ ╭───╮ ┌┼─fooStr │ ╰────╯ │"颱風"│←┘╰─────╯ ╰───╯ ----- str=f.getString(); ╭───╮ ┌──── f ╭─────╮ │int[1]│←┐ ↓ array ───→ │ int[1] │ ╰───╯ │╭─────╮ ╰─────╯ └┼─fooArr │ ╭────╮ │ │ str ───┐ │ "哭哭" │ ╭───╮ ┌┼─fooStr │ ╰────╯ │"颱風"│←┘╰─────╯ └────────→ ╰───╯ ----- array=g.getArray(); ┌────────→ ╭───╮ ┌──── f ╭─────╮ │int[1]│←┐ ↓ array ──┘ │ int[1] │ ╰───╯ │╭─────╮ ╰─────╯ └┼─fooArr │ ╭────╮ │ │ str ───┐ │ "哭哭" │ ╭───╮ ┌┼─fooStr │ │ ╰────╯ │"颱風"│←┘╰─────╯ └────────→ ╰───╯ ----- array[0]=1; 因為 array 和 fooArr 指向同一個 object , 變動該 object 兩個變數都會受影響 (雖然說受影響好像不太恰當,反正就是兩個變數取出來的值會一樣) ----- str="囧囧"; 由於 Java String Immutable 的特性,當執行這個敘述的時候其實是這樣: ┌────────→ ╭───╮ ┌──── f │ ╭─────╮ │int[1]│←┐ ↓ array ──┘ │ int[1] │ ╰───╯ │╭─────╮ ╰─────╯ └┼─fooArr │ ╭────╮ │ │ str ──┐ │ "哭哭" │ ╭───╮ ┌┼─fooStr │ ╰────╯ │"颱風"│←┘╰─────╯ │ ╭───╮ ╰───╯ └─→ │"囧囧"│ ╰───╯ str 和 fooStr 是指向不同的 objecy -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.238.228.107
popcorny:這也太用心了吧...大推 07/13 12:11
pkmilk:推 07/13 13:14
gn00742754:推! 07/13 13:59
kaocoming:推推 07/13 16:11
a60301:超用心得啊,大推 07/15 17:18
cn1754:超用心啊!! 大推 07/20 01:57