疯狂Android讲义有段代码如下,其中匿名内部类用到了外部的show对象,但为什么show不用final呢?望高手帮忙解答,万分感谢!public class AnonymousListener extends Activity
{
  EditText show;
  Button bn;    @Override
  publicvoid onCreate(Bundle savedInstanceState)
  {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     show = (EditText)findViewById(R.id.show);
     bn = (Button)findViewById(R.id.bn);     //直接使用Activity作为事件监听器
     bn.setOnClickListener(new OnClickListener()
     {
       //实现事件处理方法
       @Override
       public void onClick(View v)
       {
         // TODO Auto-generated method stub
         show.setText("bn按钮被单击了!");
       }      
     });
  }
}
javaAndroid

解决方案 »

  1.   

    如果把它写在onCreate方法里,就需要是final了。
      

  2.   

    不好解释。你可以看看Think in java 第四版,第198页
      

  3.   

    如果show是final,需要在属性或者构造方法里初始化。
      

  4.   

    注意到这个问题了,但为什么写在外面就不用final了呢?
      

  5.   

    http://blog.csdn.net/axman/article/details/1460544
      

  6.   

    这个问题对于我等菜鸟来说还是有点难以讲清楚的
    对于外部类的成员变量不用添加final这个很容易知道
    因为内部类保存了外部类的引用,内部类对其的修改都会真实
    的反映到外部类的实例上!
    至于onCreate方法中必须使用final是为了保持内外一致!
    怎么个内外一致,我有点说不清,给个链接吧,感觉说的比较到位
    http://www.blogjava.net/DLevin/archive/2011/11/23/364599.html
      

  7.   

    个人理解:如果show用final修饰的话。。刚代码第3行EditText show;就应该初始化,代表show为常量,否则会报错。
      

  8.   

    这主要是由存活时间决定的。
    因为show和存活时间是与外部类AnonymousListener同步的,如果把show写在onCreate内部,那么它的存活时间只与onCreate同步。但是一个方法内部类的存活时间是完全可以大于它本身所在方法的存活时间。如
    public Object doSomeThing() {
            final int a = 10;
            class Inner {
                public String toString() {
                    return "hello inner class in method : " + a;
                }
            }
            Inner inner = new Inner();
            return inner;
        }
    在方法结束后,内部类还可以被引用。
    内部类因为必须寄生在外部类中,它的存活时间不可能大于外部类,所以写在外部可以不用final.另:final关键字定义的变量是存在运行时常量池里的,不是存在栈里的,所以存活时间较长。