Java为什么匿名内部类参数引用需要用final进行修饰?

 更新时间:2019年04月10日 11:59:26   作者:yangyongUestc  
今天小编就为大家分享一篇关于Java为什么匿名内部类参数引用需要用final进行修饰?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

事实上,除了匿名内部类参数,方法和作用域内的内部类内部使用的外部变量也必须是final 的。原因大致总结一下:

简单解释就是:

方法中的局部变量的生命周期很短,方法结束后变量就要被销毁,加上final是为了延长变量的生命周期。

进一步解释:

内部类通常都含有回调,引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量,而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用(外围类.this),所以回调的时候一定可以访问到。

程序示例:

private Animator createAnimatorView(final View view, final int position) {
    MyAnimator animator = new MyAnimator();
    animator.addListener(new AnimatorListener() {
      @Override
      public void onAnimationEnd(Animator arg0) {
        Log.d(TAG, "position=" + position); 
      }
    });
    return animator;
  }

匿名内部类回调里访问position的时候createAnimatorView()早就执行完了,position如果不是final的,回调的时候肯定就无法获取它的值了,因为局部变量在函数执行完了以后就被回收了。所以java干脆把这样的变量设计成final,一旦初始化,就必须不能改变!这样保证任何时候进行回调都能得到所需的值。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java超详细介绍封装与访问控制修符

    Java超详细介绍封装与访问控制修符

    封装是一个非常广泛的概念,小到一个属性的封装,大到一个框架或者一个项目的封装,文中通过实例代码将详细介绍封装与访问控制修饰符
    2022-05-05
  • Java Chassis3过载状态下的快速失败解决分析

    Java Chassis3过载状态下的快速失败解决分析

    本文解密了Java Chassis 3快速失败相关的机制和背后故事,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • java使用POI实现html和word相互转换

    java使用POI实现html和word相互转换

    这篇文章主要为大家详细介绍了java使用POI实现html和word的相互转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • java字符串替换排序实例

    java字符串替换排序实例

    这篇文章主要介绍了java字符串替换排序实例,有需要的朋友可以参考一下
    2014-01-01
  • java异步调用的4种实现方法

    java异步调用的4种实现方法

    日常开发中,会经常遇到说,前台调服务,本文主要介绍了java异步调用的4种实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • SpringBoot深入分析讲解监听器模式下

    SpringBoot深入分析讲解监听器模式下

    监听器模式,大家应该并不陌生,主要的组成要素包括了事件、监听器以及广播器;当事件发生时,广播器负责将事件传递给所有已知的监听器,而监听器会对自己感兴趣的事件进行处理
    2022-07-07
  • Java编程实现打印螺旋矩阵实例代码

    Java编程实现打印螺旋矩阵实例代码

    这篇文章主要介绍了Java编程实现打印螺旋矩阵实例代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Spring核心容器之BeanDefinition解析

    Spring核心容器之BeanDefinition解析

    这篇文章主要介绍了Spring核心容器之BeanDefinition解析,Spring 将管理的对象称之为 Bean,容器会先实例化 Bean,然后自动注入,实例化的过程就需要依赖 BeanDefinition,需要的朋友可以参考下
    2023-11-11
  • Java中JS引擎实现的一句话木马

    Java中JS引擎实现的一句话木马

    这篇文章主要为大家介绍了如何利用Java中JS引擎实现的一句话木马,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-02-02
  • Java pdu短信解码全面解析

    Java pdu短信解码全面解析

    本文是根据python的方法改写的pdu短信解码,非常不错,代码简单易懂具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-10-10

最新评论