Java 当我必须使用最终声明时

Java 当我必须使用最终声明时,java,android,Java,Android,我编写了下一个android代码。变量位置必须声明为最终位置。我不明白为什么。。。当我使用Eclipse调试器时,它会识别第行中的position值:myMovieList.remove(position) 我将感谢你在这个问题上的帮助。 泰迪 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); myListView=(ListView

我编写了下一个android代码。变量位置必须声明为最终位置。我不明白为什么。。。当我使用Eclipse调试器时,它会识别第行中的position值:myMovieList.remove(position)

我将感谢你在这个问题上的帮助。 泰迪

创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myListView=(ListView)findViewById(R.id.myListView);
myListView.setOnItemClickListener(MainActivity.this);
.......
.......
.......
}
@凌驾
public void onItemClick(AdapterView父视图、视图、整型位置、,
长id){
显示删除对话框(位置);
}
私有void showdelete对话框(最终int位置){
AlertDialog.Builder=新建AlertDialog.Builder(MainActivity.this);
建造商名称(“删除”);
builder.setMessage(“您是舒尔…”);
setNegativeButton(“否”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
dialog.dismise();
}
});
builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
myMovieList.remove(位置);
notifyDataSetChanged();
}
});
builder.show();
}

当您编写以下内容时:

    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            myMovieList.remove(position);
            objAdapter.notifyDataSetChanged();
        }
    });
这称为匿名内部类(新DialogInterface.OnClickListener(){…}部分),因为您隐式创建了一个扩展
DialogInterface.OnClickListener
(和重写方法)而没有名称的类

这个匿名内部类使用
位置
,这超出了它的范围,因此它需要以某种方式存储它。这就是为什么它需要知道,在声明这个匿名类的那一刻和代码真正执行的那一刻之间,
位置
不会改变


使用
final
关键字,您可以证明此变量不会更改,因此您允许匿名内部类在内部存储
position
的当前值,而不会冒以后不同步的风险。

position
必须是
final
,因为您是从匿名内部类引用它的(正按钮所用的那一个)。谢谢!我已经更改了代码,因此可以使用调试器通过变量myPosition查看变量position的值:{int-myPosition;myPosition=position;myMovieList.remove(myPosition);
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            myMovieList.remove(position);
            objAdapter.notifyDataSetChanged();
        }
    });