final参数的根本意义
来源:互联网 发布:网络唠嗑是什么意思 编辑:程序博客网 时间:2024/04/29 17:22
如果定义一个局部内部类,并且局部内部类使用了一个在其外部定义的对象,为什么编译器会要求其参数引用是final呢?
注意:局部内部类,包括匿名内部类。
原因如下:
Java代码
- 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!");
- }
- }
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参数的根本意义.
- final参数的根本意义
- final的意义
- final的意义
- runat="server"的根本意义是什么?
- runat="server"的根本意义是什么?
- java中final的意义
- java中final的意义
- java中final的意义
- java中final的意义
- java中final的意义
- java中final的意义
- GetWindowLong参数的意义
- rman参数的意义
- RelativeLayout 的参数意义
- CURLOPT_HTTPPROXYTUNNEL参数的意义
- rman参数的意义
- LayoutParams参数的意义
- CATransform3D参数的意义
- 2013年末,工作经验总结
- java虚拟机jvm关于内存的设置与调优
- QTP/UFT产生随机数
- 科大讯飞2013-2014年度联欢颁奖典礼隆重举行!
- 利用Eclipse查看JDK源码[转]
- final参数的根本意义
- 文本多余部分...显示
- linux小结
- 【ZooKeeper Notes 7】使用super身份对有权限的节点进行操作
- qt截屏模块
- Android中的monkey用法
- XHTML之基础三问
- 在java1.7之前 switch中使用String作为分支条件
- JAVA 跨平台原理