高阶函数函数体内的局部变量
来源:6-1 高阶函数

_Jihan
2020-04-10
value现在通过Fibonacci赋值为函数类型,即为红框内的函数体。
我现在有两个疑问就是:
1.value中的函数first以及second是怎么关联到Fibonacci中的局部变量first以及second?
2.因为在java中局部变量随着函数体执行完毕会释放,在第一个问题基础上,那么这里怎么判断first是否执行完毕呢?
写回答
2回答
-
kotlin当中函数跟普通类一样,有对象,所以问题1实际上就是lambda表达式直接访问外部作用域的变量,你可以理解成访问外部类的成员。
这里因为有函数返回,因此外部函数不会结束,这个java是做不到的。
112020-04-10 -
慕移动4574462
2023-01-27
public static final Function0 fibonacci() { final Ref.LongRef first = new Ref.LongRef(); first.element = 0L; final Ref.LongRef second = new Ref.LongRef(); second.element = 1L; return (Function0)(new Function0() { // $FF: synthetic method // $FF: bridge method public Object invoke() { return this.invoke(); } public final long invoke() { long next = first.element + second.element; long current = first.element; first.element = second.element; second.element = next; return current; } }); }
show kotlin bytecode 之后反编译的结果, 看着 first second 是基本类型 Long 局部变量, 其实被编译期处理成了引用类型 Ref 存储在堆上, 返回了 Function 对象仍然在引用, 所以不会回收且一直能保存更新值.
00
相似问题