首页 新闻 搜索 专区 学院

java final修饰的变量的生命周期问题

0
悬赏园豆:20 [已关闭问题] 关闭于 2014-08-06 16:24

方法中的匿名内部类要访问方法的局部变量的话,这个变量必须被final修饰

如果不修饰的话创建匿名对象的时候可能局部变量的生命周期已经结束了

但是加了final之后我想知道这个局部变量的生命周期变成什么样了

还有这个局部变量存在内存中的什么位置

是栈?堆还是方法区

问题补充:

public class MainActivity extends Activity {
private EditText one, two;//把它定义在onCreate()方法中就会报错
private Button sum;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
(EditText 加入定义在这里) one = (EditText) this.findViewById(R.id.one);
(EditText) two = (EditText) this.findViewById(R.id.two);
sum = (Button) this.findViewById(R.id.sum);
sum.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SumActivity.class);
String strOne = one.getText().toString();
String strTwo = two.getText().toString();
intent.putExtra("one", strOne);
intent.putExtra("two", strTwo);
MainActivity.this.startActivity(intent);
}
});

}

GrandKai的主页 GrandKai | 初学一级 | 园豆:119
提问于:2014-08-06 15:48
< >
分享
所有回答(2)
1

内部类引用外部的变量,必须声明为final

不然会引发并发安全问题
你想啊,你那个回调事件不是立即执行,是以后某个时刻才执行。如果不定义成final,某个时刻我把ExitText那个变量置为null,你哪个回调岂不是报错了

GrandKai | 园豆:119 (初学一级) | 2014-08-06 16:24
0

这个解释还是合理。
局部变量的生命周期跟原来应该还是一样的,随着方法体的结束在栈帧中被销毁。匿名内部类访问的是局部变量的拷贝,也可以认为是局部变量的副本。

孔乙己的茴香豆 | 园豆:202 (菜鸟二级) | 2020-12-01 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册