在一个方法中,如果创建一个匿名内部类,并且在内部类中药访问方法的参数,我们必须将该参数用final进行修饰才能访问,这个的原因主要是由于方法和内部类的生命周期不相同导致的。
当我们执行一个带参的方法时,在该方法的调用栈中将生成一个局部变量(即该参数),如果在该方法中创建了局部内部类,则jvm会产生一个inner_object,但是,此inner_object并不会随着方法的执行完毕而销毁。因此,当方法执行完毕之后,方法调用栈中的局部变量也将销毁,这个时候局部内部类没有被销毁,就会发生之前能访问的参数此时找不到了的尴尬情况。
而当我们使用final对参数进行修饰之后,jvm中将产生一个该参数的复制,局部内部类不再直接访问该参数,而是访问这个参数的复制。这样,当方法执行完毕,调用栈中的参数销毁之后,局部内部类依然可以访问到这个参数在jvm中的复制,而不会发生异常。
上述的限制在Java8中已经不复存在了,从Java8开始,我们不再需要将参数定义为final,局部内部类也可以正常的访问方法中的参数。
In addition, a local class has access to local variables. However, a local class can only access local variables that are declared final. When a local class accesses a local variable or parameter of the enclosing block, it captures that variable or parameter.
However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.
Starting in Java SE 8, if you declare the local class in a method, it can access the method's parameters.
参考: