基本类型在finally中修改不影响return结果,因为return复制的是数值快照;引用类型则会影响,因为return复制的是堆中对象地址,finally可通过该地址修改对象状态。

在 Java 的 finally 块中修改变量,是否影响 return 的结果,关键取决于该变量是基本类型还是引用类型——因为 return 语句实际返回的是“栈中值的一份快照”,而这两类数据的快照内容完全不同。
return 实际返回的是什么?
Java 中,当执行 return 语句时,JVM 会立即把当前要返回的值(或地址)复制一份,作为最终返回结果。这个复制动作发生在 finally 执行之前,但复制的内容取决于变量类型:
- 基本类型:复制的是数值本身(如 18)
- 引用类型:复制的是对象在堆中的地址(如指向 Person@1a2b3c 的引用)
基本类型在 finally 中修改无效
因为 return 复制的是数值快照,后续对局部变量的修改只作用于栈中那个变量,不影响已复制出去的返回值。
-
int a = 18;→ 栈中存着数字 18 -
return a;→ 把 18 这个值拷贝出去 -
finally { a = 28; }→ 只改了栈里那个 a,和已拷贝的 18 无关
引用类型在 finally 中修改有效
因为 return 复制的是地址,而该地址指向的堆中对象仍可被修改;finally 里通过该地址操作对象属性,等同于修改了“同一个对象”。
-
Person p = new Person(); p.age = 18;→ 堆中对象 age 是 18,栈中 p 存的是它的地址 -
return p;→ 把这个地址拷贝出去(不是拷贝整个 Person 对象) -
finally { p.age = 28; }→ 用同一地址找到堆中对象,并把它的 age 改成 28 - 所以最终调用方拿到的是地址,顺着它读到的 age 就是 28
注意:final 修饰不改变这一逻辑
即使变量被 final 修饰,只要它是引用类型,其指向的对象内容依然可变:
-
final Person p = new Person();→ p 不能再指向别处,但 p.age = 28 合法 - 所以
finally里仍能通过 p 修改堆中对象的状态 - 而
final int a = 18;在 finally 中连 a = 28 都编译不过
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











