什么是非最终变量?

时间:2011-12-10 10:55:18

标签: java blackberry java-me

我不理解final变量的概念。在for循环中,我有动态变量i,这对我来说引用数组至关重要。我一使用i,就会发出错误消息,说它应该是final

究竟是什么final?你能帮忙摆脱那个错误吗?

我的代码在这里:

for( int i = 0; i <4; i++)
{

   Bitmap celeb1=Bitmap.getBitmapResource(fimagearray[i]);
   Bitmap celeb1_focus=Bitmap.getBitmapResource(fimagearray[i]);
   ImageButton celebbutton = new ImageButton(celeb1, celeb1_focus);

   celebbutton.setChangeListener(new FieldChangeListener() {

       public void fieldChanged(Field field, int context) 
       {
           UiApplication.getUiApplication().pushScreen(new FetchTweets(fusernamearray[i]));

       }
   });


   femaleSec.add(celebbutton);
}

3 个答案:

答案 0 :(得分:10)

匿名内部类只能从外部作用域访问final个变量。由于i不是最终版,因此无法直接访问。由于需要更改,因此无法使i成为最终版本,并且无法更改最终变量。

作为一种简单的解决方法,在每次循环迭代期间将i的值复制到最终变量中:

for( int i = 0; i < 4; i++)
{
    final int index = i; // <-- copy i to `index' to use in FieldChangeListener

    // ...

    celebbutton.setChangeListener(new FieldChangeListener() {

        public void fieldChanged(Field field, int context) 
        {
            UiApplication.getUiApplication().pushScreen(
               new FetchTweets(fusernamearray[index])); // <-- `index'
        }
    });


    femaleSec.add(celebbutton);
}

答案 1 :(得分:2)

最终变量只能通过初始化程序或赋值语句初始化一次

查看this链接。

另请参阅this示例。

答案 2 :(得分:2)

您正在尝试在“匿名内部类”中使用i的值,该值要求将该类的所有非局部变量声明为final,这意味着该变量的值可能一旦初始化,就不要改变。

@aix发布的解决方案可以解决您的问题。