黑马程序员技术交流社区

标题: Java中匿名内部类对外部类方法局部变量或参数引用 问题 [打印本页]

作者: 乔建国    时间: 2012-5-9 22:02
标题: Java中匿名内部类对外部类方法局部变量或参数引用 问题
匿名内部类一般定义在一个方法的内部,如果要访问该方法的参数或者方法中定义的变量,则这些参数或者变量必须使用final修饰。
虽然匿名内部类定义在方法的内部,但在编译时内部类与外部类中的方法属于同一个级别,外部类中方法的变量或参数只是方法的局部变量,这些变量或者参数的作用域只在当前方法内部有效。但是如果这些变量用final修饰,内部类就可以保存方法变量的备份,即使方法销毁也能保证内部类在访问时不会出现访问不到的错误。

interface Father {
    public void print();
}

public class InnerDemo2 {
         private int field = 10;
         public void print(final int param) {
                 final long local = 100;
                 new Father() {
                         public void print() {
                                 System.out.println("Field value: " + field);
                                                           System.out.println("Local value: " + local);
                                 System.out.println("Parameter: " + param);
                                                          }
                 }.print();
         }
         
         public static void main(String[] args) {
                 InnerDemo2 id2=new InnerDemo2();
                 id2.print(5);
        }
}

匿名内部类要访问局部变量,但是函数的局部变量在执行完后会立即退出,销毁掉所有临时变量。而产生的匿名内部类可能会保留.
匿名内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。 这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内部类改掉了这些参数的值也不可能影响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部调用的时候又发现值其实没有被改掉,这就让人非常的难以理解和接受,为了避免这种尴尬的问题存在,所以编译器设计人员把内部类能够使用的参数设定为必须是final来规避这种莫名其妙错误的存在。

这是我查看资料后做的一点总结,大家有更好的理解的可以在这里分享一下哦
作者: 曹恒业    时间: 2012-8-14 20:30
这么好的总结竟然没人mark?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2