内部类调用局部参数为何用final关键字
2017-07-24 23:20
267 查看
public void mRun(final String name){ new Runnable() { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(name); } }.start(); }这种代码相信大家写过很多,当内部类访问局部变量的时候,需要在局部变量前加final修饰符,不然编译器就会报错。通常我们也是这么干的。好的,第二个问题来了,为什么要加final修饰符?相信大多数小伙伴都没有思考过这个问题,但凡使用的时候,直接加上就得了,从来没去深究过其中的原理。这对于一个优秀的程序员来说是不可取,我们不仅要知其然还要知其所以然。
现在我们来分析一下,为什么要加final关键字。首先内部类的生命周期是成员级别的,而局部变量的生命周期实在方法体之类。也就是说会出现这样一种情况,当mRun方法执行,new 的线程运行,新线程里面会睡一秒。主线程会继续执行,mRun执行完毕,name属性生命周期结束。1秒之后,Syetem.out.printh(name)执行。然而此时name已经寿终正寝,不在内存中了。Java就是为了杜绝这种错误,严格要求内部类中方位局部变量,必须使用final关键字修饰。局部变量被final修饰之后,此时会在内存中保有一份局部变得的复制品,当内部类访问的时候其实访问的是这个复制品。这就好像是把局部变量的生命周期变长了。说到底还是Java工程师提前把这个坑给我们填了,不然不知道又会有多少小伙伴会为了内部类局部变量而发愁了。
相关文章推荐
- 关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?
- 关于局部内部类访问所在方法的参数或局部变量为什么必须是final的
- 局部内部类访问方法的参数和局部变量必须是final的
- 一个内部类定义在外部类方法中的的例子(调用参数的时候需要注意final来修饰)
- Java 局部内部类访问局部变量必须加 final 关键字
- 解释为何内部类访问外部对象时要设参数为final
- 匿名内部类调用参数时为什么参数必须是final的
- [置顶] 为什么匿名内部类和局部内部类只能访问final类型参数
- Java 局部内部类访问局部变量必须加final关键字
- 匿名内部类调用参数需要为final
- 为什么匿名内部类参数必须为final类型
- 为什么匿名内部类调用的方法内局部变量必须为final
- java 匿名内部类的方法参数需要final吗?
- 为什么匿名内部类参数必须为final类型
- 为什么内部类调用外部变量,外部变量必须用final修饰
- JAVAEE第15天-static,final关键字,访问权限修饰符,内部类,静态代码块,包的声明和导入
- 匿名内部类使用了一个在其外部定义的对象,为什么编译器会要求其参数引用是final呢
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- java为什么匿名内部类的参数引用时final?
- Python 函数的默认参数, 关键字参数的调用