java 匿名内部类
参考:
http://blog.sina.com.cn/s/blog_62ea4cf40100mubj.html
http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html
什么是匿名内部类:
运行中声明的类
abstract class Person { public abstract void eat(); } public class Demo { public static void main(String[] args) { Person p = new Person() { public void eat() { System.out.println("eat something"); } }; p.eat(); } }
1.匿名内部类肯定是局部内部类(在一个方法里面定义的内部类),因为在java中,语句必须写在方法里,而匿名内部类其实就是一条特殊的语句;
2.内部类很微妙,它可以直接访问外部类的private field,这打破了类的封装。但是内部类又有它自身的好处,比如简洁,可见性等,于是就把它定位成“只读”,也就是final。不过这个保护也非常脆弱!
为什么是final类型:
http://blog.csdn.net/woshichunchun/article/details/7925823
追究根本原因其实就是作用域中变量的生命周期导致的。
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。