final参数的根本意义

来源:互联网 发布:网络唠嗑是什么意思 编辑:程序博客网 时间:2024/04/29 17:22

如果定义一个局部内部类,并且局部内部类使用了一个在其外部定义的对象,为什么编译器会要求其参数引用是final呢?
注意:局部内部类,包括匿名内部类。

原因如下:

Java代码  

  1. abstract class ABSClass{  
  2. public abstract void print();  
  3. }  
  4.   
  5. public class Test2{  
  6. public static void test(final String s){//一旦参数在匿名类内部使用,则必须是final  
  7. ABSClass c=new ABSClass(){  
  8. public void print(){  
  9. System.out.println(s);  
  10. }  
  11. };  
  12. c.print();  
  13. }  
  14. public static void main(String[] args){  
  15. test("Hello World!");  
  16. }  
  17. }  

abstract class ABSClass{

public abstract void print();

}

 

public class Test2{

public static void test(final String s){//一旦参数在匿名类内部使用,则必须是final

ABSClass c=new ABSClass(){

public void print(){

System.out.println(s);

}

};

c.print();

}

public static void main(String[] args){

test("Hello World!");

}

}


JVM中每个进程都会有多个根,每个static变量,方法参数,局部变量,当然这都是指引用类型.基础类型是不能作为根的,根其实就是

一个存储地址.垃圾回收器在工作时先从根开始遍历它引用的对象并标记它们,如此递归到最末梢,所有根都遍历后,没有被标记到

的对象说明没有被引用,那么就是可以被回收的对象(有些对象有finalized方法,虽然没有引用,但JVM中有一个专门的队列引用它

们直到finalized方法被执行后才从该队列中移除成为真正没有引用的对象,可以回收,这个与本主题讨论的无关,包括代的划分等

以后再说明).这看起来很好.

但是在内部类的回调方法中,s既不可能是静态变量,也不是方法中的临时变量,也不是方法参数,它不可能作为根,在内部类中也没

有变量引用它,它的根在内部类外部的那个方法中,如果这时外面变量s重指向其它对象,则回调方法中的这个对象s就失去了引用,

可能被回收,而由于内部类回调方法大多数在其它线程中执行,可能还要在回收后还会继续访问它.这将是什么结果?

而使用final修饰符不仅会保持对象的引用不会改变,而且编译器还会持续维护这个对象在回调方法中的生命周期.所以这才是 final变量和final参数的根本意义.

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 氨基酸的功能 限制氨基酸 氨基酸洗面奶的缺点 复方氨基酸注射液18aa 氨基酸适合什么年龄 氨基酸洗面奶不适合那些人 支链氨基酸什么时候吃 eltamd氨基酸洁面乳 氨基酸适合什么人群 小儿复方氨基酸注谢液作用 输氨基酸适合什么人群 氨基酸洗面奶有什么功效 含有氨基酸的洗面奶 氨基酸洗面奶的功效与作用 氨基酸洁面乳的作用与功效 氨基酸洗面奶有哪些 氨基酸洗面奶的好处 氨基酸洗面奶有什么作用 氨基酸的功效与作用对皮肤 注射氨基酸的功效与作用 氨基酸输液功效与作用 口服氨基酸的功效与作用 输氨基酸的功效与作用 吊氨基酸的功效与作用 氨基酸口服液哪个牌子好 氨基酸对皮肤的作用 芳草集氨基酸洗面奶 芙丽芳丝氨基酸洗面奶 氨基酸口服液的功效与作用 复方氨基酸注谢液价格 挂氨基酸有什么好处 全自动氨基酸分析仪 价格 氨基酸注射夜的功效 孕妇可以输氨基酸吗 全自动氨基酸分析仪 氨基酸洗发水的功效与作用 孕妇打氨基酸有什么好处 氨基酸水溶肥料的作用 吃氨基酸有什么好处 什么牌子的氨基酸洗面奶好用 氨基酸是酸性还是碱性