public class Test {  int b = 0;  void f(final int a) { 
               final int c;
class B {  void print() { 
System.out.println(a); 
System.out.println(b); 
System.out.println(c); 

}

}  public static void main(String[] args) {  } } 
如题,为什么a和c都必须是final呢?能从本质上讲解一下吗?非常感谢!困扰菜鸟很久了

解决方案 »

  1.   

    局部内部类在定义该函数的作用域中可以访问所有变量:
    局部变量 方法参数 实例变量 静态变量
    唯一的限制是只有上述内容被声明为final,才可以被访问这种限制的主要原因是与多线程问题相关,
    以及确保从内部类中访问时所用这样的变量都有明确定义的值
      

  2.   

    楼主的例子,是 局部内部类 的使用。因为c(你应该给它初始化的)是局部变量。所以离开了方法的作用于,它就消失了。(被弹出)而你的 局部内部类 B,可以返回一个B的引用,使它得到永恒。(相对的永恒,不像变量c一样,瞬间消失)所以,要把c变量的复制一份给类B,这时候c可能消失了。但由于复制了一份c给局部内部类B,所以造成的假象是c也永恒了。(这样才合理,否则永恒的对象B就要保存瞬间的c了)所以就要把c声明为final的,非final类型的变量可能有多种值,而final类型的变量值不可变,没有任何问题,就复制这个给局部内部类B。所以
      

  3.   

    final变量值并不是不可变的吧.不过被final修饰的变量一旦被初始化,就不能被再次赋值了,这样保证内部类接受的参数指向不会发生变化的说.我就记住得这么用.不怎么去管原理呢,这么学java会不会糟糕了点啊?
      

  4.   

    我就一句话: final延长了这个局部变量生存的时间!
      

  5.   


    想不到小明同学在J2SE领域也有不懂的东西啊
      

  6.   

    这个是为了防止外部变话,指定为final的变量被初始化后就不能再变了。
    同时局部变量申明为final可以延长生存期,防止这个方法退出后该变量就消失了,导致内部类无法得到有效引用,这个问题3楼说的很清楚了。
      

  7.   

    局部内部类在定义该函数的作用域中可以访问所有变量:
    局部变量 方法参数 实例变量 静态变量
    唯一的限制是只有上述内容被声明为final,才可以被访问