日期:2014-05-20  浏览次数:20716 次

请问:inner class中使用的参数为什么必须为final啊?
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.内部类不允许静态修饰(包括静态域,方法,静态初始化)
2.内部类可以直接访问外围类的方法。
3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。这样做是为了规范内部类的行为.

这是出于变量作用域的限制考虑. 内部类能使用的变量局限于内部类里面声明的变量, 一般情况下不能使用外面的. 但如果外部变量被声明为final的, 就相当于是一个全局变量, 它的生命周期就扩展到内部类里面了, 因此可以访问.
加final修饰符是为了防止该变量指向其他引用,比如你将这个变量指向null而外部类却毫不知情的继续在使用这个null的变量




------解决方案--------------------
内部类使用注意事项:
这里不考虑静态内部类,因为没有什么特别的限制
1.内部类不允许静态修饰(包括静态域,方法,静态初始化)
2.内部类可以直接访问外围类的方法。
3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。这样做是为了规范内部类的行为.

这是出于变量作用域的限制考虑. 内部类能使用的变量局限于内部类里面声明的变量, 一般情况下不能使用外面的. 但如果外部变量被声明为final的, 就相当于是一个全局变量, 它的生命周期就扩展到内部类里面了, 因此可以访问.
加final修饰符是为了防止该变量指向其他引用,比如你将这个变量指向null而外部类却毫不知情的继续在使用这个null的变量
------解决方案--------------------
一种规范 怕乱引用
------解决方案--------------------
是的。你也可以自己敲一下。代码。试一下。就清楚了。
class Gizmo{
public void sppin(){}
}
public class FinalArguments{
void with(final Gizmo g){
//不能 g=new Gizmo();
}
void without(Gizmo g){
g=new Gizmo();//这里就是可以的哦。
}
}

------解决方案--------------------
xuexi....
------解决方案--------------------
楼主的代码,我敲到MyEclipse中,编译的通不过,在B类中的f(){}这句会出现红色波浪线。

而且楼主还将代码写成 void f() {}; 这里加上分号本来就是错的

------解决方案--------------------
to yiyi2007():

大概是文字翻译方面的问题。在《Java Language Specification》中有两个词,nested class 和 inner class,是有区别的。

楼主说的应该是 inner class,而你上面说的这个“内部类”好像是指 nested class。