关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?
来源:互联网 发布:近年物流业发展数据 编辑:程序博客网 时间:2024/06/05 06:56
这个问题我碰到过好几次了,也不怎么在意,但是一直不知道真正原因,刚去网上查了下资料,终于知道他的真正原因了。
由于方法中的变量属于当前所在的方法帧,当方法返回的时候方法帧退栈,导致方法中的变量丢失,那么这些匿名的内部类或者局部内部类对该变量的引用就是去了意义,所以通过修饰符final可以把变量变为常量,由于变量和常量的生命周期和存储位置不同,所以常量的值是不会被销毁的,即使方法已经退出,知道结果了吧。
这样干说,可能大家都不知道这样有什么意义,可能会想这样的机制在实战中有什么用呢?
举个例子吧:
package com.example.test;public class AnonymousInnerClass {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubAnonymousInnerClassInterface anonymousSayHi = getAnonymousClassMethod();anonymousSayHi.AnonymousinnerMethod();AnonymousInnerClassAbstract anonymousSayHi_ = getAnonymousClassMethod_a();anonymousSayHi_.AnonymousinnerMethod_0();anonymousSayHi_.AnonymousinnerMethod_1();}public static AnonymousInnerClassAbstract getAnonymousClassMethod_a(){final String hi = "Hi,";return new AnonymousInnerClassAbstract(){void AnonymousinnerMethod_0() {// TODO Auto-generated method stubSystem.out.println(hi+"Call AnonymousinnerMethod_0");}};}public static AnonymousInnerClassInterface getAnonymousClassMethod() {// String hi = "Hi,";//这个是错的,原因参考刚才阐述。final String hi = "Hi,";return new AnonymousInnerClassInterface() {public void AnonymousinnerMethod() {// TODO Auto-generated method stubSystem.out.println(hi + "Call AnonymousInnerMethod");}};}}// 定义局部内部类的上层接口,用于允许返回匿名内部类//用abstract class的方式abstract class AnonymousInnerClassAbstract {String hi = "Hi,"; abstract void AnonymousinnerMethod_0();//这个必须要加abstract,应为默认的不是abstractvoid AnonymousinnerMethod_1() {System.out.println(hi + "Call AnonymousinnerMethod_1");}}//用interface的方式interface AnonymousInnerClassInterface {String hi = "Hi,";//默认的是static finalvoid AnonymousinnerMethod();//默认abstract}
运行结果:
Hi,Call AnonymousInnerMethod
Hi,Call AnonymousinnerMethod_0
Hi,Call AnonymousinnerMethod_1
看到为什么要这么干了吧,相信大家也经常见到这个所谓的匿名内部类,尤其是Android程序中,就这样了。
0 0
- 关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- java中内部类访问局部变量的时候,为什么变量必须加上final修饰
- java中内部类访问局部变量为什么要定义局部变量为final
- 在java中, 方法的内部类可以访问方法中的局部变量,但必须用final修饰才能访问。
- 为什么匿名内部类只能访问final修饰的变量
- 匿名内部类使用外部的局部变量时为什么一定要final修饰
- 为什么匿名内部类调用的方法内局部变量必须为final
- 为什么匿名内部类调用的方法内局部变量必须为final
- 为什么匿名内部类调用的方法内局部变量必须为final
- 为什么匿名内部类调用的方法内局部变量必须为final
- Java8中 局部内部类访问的局部变量不必用final修饰
- 局部内部类访问的局部变量不必用final修饰,java8中
- 为什么局部内部类和匿名内部类只能访问final的局部变量?
- 为什么在匿名内部类中引用外部对象要加final修饰符
- 为何在匿名内部类中只能问被final修饰的本地变量?
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- ld error when compile the libwebcore.so
- java 方法分派笔记
- 哪种PDF转换器转换效果好
- 判断单链表是否存在环有问题
- android开发,使用fragment加载webview,加载出现1秒空白。
- 关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- B. DZY Loves Strings
- c++ 简单模拟实现 游戏定时开启任务
- Altium Desinger 6.9 的PCB规则设置
- 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)
- HDU3015 Disharmony Trees
- 解决无线路由器连接AP外置型epon上行e8-c家庭网关无法上网的问题
- C++两个不同类成员之间的调用