本帖最后由 Neverbelazy 于 2013-4-19 20:57 编辑
毕老师Java 基础视频Day10 中提到过 定义在局部的内部类如果调用局部变量,此局部变量需要被标记为final。
比如:- class Outer{
- void method{
- final int x=0;
- class Inner{
- void function(){
- System.out.print(x);
- }
- }
- }
- }
复制代码 毕老师给出了结论,没有给出具体的说明,我自己思考了一些理由,写在这里,欢迎大家指正,谢谢!
我认为,原因由如下3点组成:
1. 局部变量在栈中,是在代码方法执行的时候被调用的。内部类的对象在堆中,是随着对象的生产而产生的;
2. 堆中的对象是可以根据程序运行时被对象的引用(栈中数据)调用,甚至改变的;但是栈中的数据一般不会也不应该在堆中被类的内部运算所调用甚至改变 (个人对这点有点不确定,希望给予指正)
3. 当内部类被定义在局部时,却造成了,局部的变量(栈中数据)可以被堆中数据使用的情况,为了避免这种堆中使用数据时改变了栈中数据的情况,所以强制的让这种调用,只能实用final修饰的局部变量
如果不用final会有什么情况? 如果没有final,那么,栈中的数据就会被内部类所改变,而这种状况是不可知的(因为类对代码的封装封装),所以会导致很多意外的情况发生。 |