• 匿名内部类中使用的外部局部变量为什么只能是final变量


    被匿名内部类引用的变量会被拷贝一份到内部类的环境中

    但其后,在外部,该变量如果被修改,则内部外部不一致

    Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制。

    究其原因,在于 区域变量 x 并不是真正被拿来于内部匿名类别中使用,而是在内部匿名类别中复制一份,作为field成员来使用,由于是复本,即便您在内部匿名类别中对 x 作了修改,会不会影响真正的区域变量 x,事实上您也通不过编译器的检查,因为编译器要求您加上"final"关键词,这样您就知道您不能在内部匿名类别中改变 x 的值。

    总结下来就是:

    • Java设计者想要匿名函数或者Lambda函数内部外部保持数据一致性(知道了目的才好理解)
    • 然而Java只是实现了capture-by-value形式的闭包,也就是匿名函数内部会重新拷贝一份自由变量(参考答案中闭包的概念),然后函数外部函数内部就有两份数据
    • 那么要想实现1中的目的,只能要求两处变量不变。JDK8之前要求使用final修饰,JDK8聪明些了,可以使用effectively final的方式。java8里不用final修饰局部变量也可以编译通过。总之,两边不变就行了。


    https://www.zhihu.com/question/21395848

  • 相关阅读:
    clientX和clientY属性需要注意的地方
    事件冒泡 --- 仿select下拉框
    body和document的梗
    完美运动框架
    仿flash运动框架
    多物体运动框架
    Computed Styles
    悬浮框
    【一起驴友】公司笔试
    Client Dimensions , offsetHeight , scrollTop 属性详解
  • 原文地址:https://www.cnblogs.com/twoheads/p/9548821.html
Copyright © 2020-2023  润新知