interface A {
   void f();
}class B {
   public A m(final int a) {
     return new A() {
          int b = a;
          void f() {};
     }

}
请问 final int a, 为什么必须是final

解决方案 »

  1.   

    内部类使用注意事项:
    这里不考虑静态内部类,因为没有什么特别的限制
    1.内部类不允许静态修饰(包括静态域,方法,静态初始化)
    2.内部类可以直接访问外围类的方法。
    3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
    4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
    在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。这样做是为了规范内部类的行为.这是出于变量作用域的限制考虑. 内部类能使用的变量局限于内部类里面声明的变量, 一般情况下不能使用外面的. 但如果外部变量被声明为final的, 就相当于是一个全局变量, 它的生命周期就扩展到内部类里面了, 因此可以访问.
    加final修饰符是为了防止该变量指向其他引用,比如你将这个变量指向null而外部类却毫不知情的继续在使用这个null的变量                
      

  2.   

    内部类使用注意事项:
    这里不考虑静态内部类,因为没有什么特别的限制
    1.内部类不允许静态修饰(包括静态域,方法,静态初始化)
    2.内部类可以直接访问外围类的方法。
    3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
    4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
    在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。这样做是为了规范内部类的行为.这是出于变量作用域的限制考虑. 内部类能使用的变量局限于内部类里面声明的变量, 一般情况下不能使用外面的. 但如果外部变量被声明为final的, 就相当于是一个全局变量, 它的生命周期就扩展到内部类里面了, 因此可以访问.
    加final修饰符是为了防止该变量指向其他引用,比如你将这个变量指向null而外部类却毫不知情的继续在使用这个null的变量
      

  3.   

    是的。你也可以自己敲一下。代码。试一下。就清楚了。
    class Gizmo{
    public void sppin(){}
    }
    public class FinalArguments{
      void with(final Gizmo g){
        //不能 g=new Gizmo();
      }
      void without(Gizmo g){
        g=new Gizmo();//这里就是可以的哦。
      }
    }
      

  4.   

    楼主的代码,我敲到MyEclipse中,编译的通不过,在B类中的f(){}这句会出现红色波浪线。而且楼主还将代码写成 void f() {};    这里加上分号本来就是错的
      

  5.   

    二楼说“1.内部类不允许静态修饰(包括静态域,方法,静态初始化)”有点问题。内部类可以使用public,protected,default,private等4种访问权限控制内部类可以被声明为static(普通类是不可以的),这样的内部类变成顶层类,相当于把它放在外面,不再是嵌套的内部类,不能再引用外包类对象。顶层类可以声明static成员。如果内部类需要定义static成员,则该内部类必须声明为static,否则,一般内部类的成员不能被声明为static.
    以上文字是书中的原话。
      

  6.   

    to yiyi2007():大概是文字翻译方面的问题。在《Java Language Specification》中有两个词,nested class 和 inner class,是有区别的。楼主说的应该是 inner class,而你上面说的这个“内部类”好像是指 nested class。