分享

彻底搞懂java匿名内部类final

 liang1234_ 2019-01-24
1. 其实是局部匿名内部类,跟内部类是有本质区别
2. 对于局部变量是final,对全局变量不是的
3. 为什么对局部变量是final呢?
 a.从最初的设计讲:匿名内部类传进来就是那个局部变量的引用,而普通调用,认为传进来的是对象,而不是引用;
 b.常规说法:当方法运行完后,局部变量被销毁,如果局部匿名内部类还可以访问到局部变量,超出了作用域。
 说法没错,但必须要正确理解:
  a1.首先销毁的并不是方法内产生的对象,而是对象的局部变量引用; 看下面两个图即可知;
  a2.超出作用域:因为传进来的是局部变量的引用,所以不应该允许引用都被销毁了,还可以做更改;所以这是为什么说“超出作用域”,这也是为什么需要定义final的原因;
 c.底层原理
  还是从最初的设计来的,匿名内部类的简化操作,他的存在的最大作用就是执行一段代码,所以它不需要构造方法,所以外面的对象应该以怎样的方式传进来呢?那就没有
  办法传进来了,但我又想用外面的东西怎么办?
    那就直接用,直接用的效果就是,看起来是直接用的外面的引用。
  但事实上,底层是将外面的对象拷贝了一份到匿名内部类里,帮我们做了构造,这么做的原因就是在于:就是为了避免局部方法执行完销毁了引用和对象的原因,生命周期
  差异的原因,所以才做了一个拷贝动作,而对于全局变量就不用这样做了,因为全局变量的生命周期足够长。
  而就是这个拷贝,就会让外部的修改和内部对象的修改不同步了,但这种明显是不对的,因为开发者认为他们是同一个东西,所以既然这样,干脆直接禁止修改好了,加final。
4. 个人观点:
  个人认为这是java设计的一个不好的地方。
  好的方式:就直接让开发者认为不论是普通的函数调用,还是匿名内部类的调用,都是传进来的对象即可,而不是引用。 


为了简单,这里直接用了内部类

也是为了简化,用了static全局变量

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多