質問するログイン新規登録

回答編集履歴

1

追記

2019/07/23 10:20

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -42,7 +42,16 @@
42
42
 
43
43
  > 結果として反映されないのですが理由がわかりません。
44
44
 
45
- 新たにIntegerオブジェクトを作り、再代入が発生しているからです。
45
+ 再代入が発生しているからです。
46
+ 代入前と代入後の変数valは、指し示すオブジェクトが違います。
47
+ ```Java
48
+ val += 10;
49
+
50
+ これは、次のように書いたのと同じ。
51
+
52
+ val = val + 10;
53
+ ```
54
+
46
55
  これは先の例を少し改変しても再現できます。
47
56
  ```Java
48
57
  import java.util.*;
@@ -82,4 +91,17 @@
82
91
  catch
83
92
  finally
84
93
  [1, 2, 3]
85
- ```
94
+ ```
95
+
96
+ まとめ
97
+ ---
98
+ ```Java
99
+ } catch(RuntimeException e) {
100
+ val = 10;
101
+ return val; // この時点で返すべきvalオブジェクトが決まっている。
102
+ } finally {
103
+ val += 10; // 新しいオブジェクトを再代入しても元のオブジェクトには反映しない。
104
+ }
105
+ ```
106
+
107
+ 変数とオブジェクトの差を意識しないとなかなか気付きづらいです。