Kha*_*aza 13 java android final local-variables inner-classes
我有按钮点击监听器,在onCreate()方法中我有一个局部变量
onCreate() {
super.onCreate();
int i = 10;
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
i++;
}
});
Run Code Online (Sandbox Code Playgroud)
为什么java要求让我最终?
bir*_*rdy 26
当onCreate()方法返回时,您的局部变量将从堆栈中清除,因此它们将不再存在.但是匿名类对象new View.OnClickListener()引用了这些变量.因为它是错误的行为所以java不允许你这样做.
在它最终之后它变成一个常数.所以它存储在堆中,可以安全地用在匿名类中.
hrn*_*rnt 13
你的匿名内部类通过获取局部变量的副本来引用它的封闭范围 - 如果你想在匿名内部类中更改int的值,你需要做一些hackery:
final int[] arr = new int[1];
arr[0] = 10;
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
arr[0]++;
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 12
因为您在匿名内部类中访问它.你不能这样做.您可以将其设置为final,然后从匿名内部类中读取它,但您无法增加它.
选项:
AtomicInteger或类似的东西除非我需要i从其他任何地方进入,否则我可能会赞成第二种选择.老实说,我认为第三种选择是一种讨厌的黑客攻击.
| 归档时间: |
|
| 查看次数: |
31022 次 |
| 最近记录: |