疯狂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
{
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
解决方案 »
- Tomcat提示信息不停止!(急)
- jdk的版本
- 最后六分了,我晕,来看看,关于hashMap的,帮帮忙,实在要分的,到我的其他帖子上拿分,今天用的分太多了,或者明天来
- 如何将一个Panel上的graphics转移到另一个上去。。
- 关于java.lang.UnsupportedClassVersionError的问题
- 一个奇怪的包引入问题,大家看看吧
- 错在哪里啊??
- 关于抽象类的问题?
- 如何提取一个文件的所有父目录的名称,我使用fileString.split("\\"),不行呀
- Java JList 如何删除所有项 而不是选中后删除所有项
- 求助,使用定时器,执行两个定时任务为何无效?
- java打印日历
对于外部类的成员变量不用添加final这个很容易知道
因为内部类保存了外部类的引用,内部类对其的修改都会真实
的反映到外部类的实例上!
至于onCreate方法中必须使用final是为了保持内外一致!
怎么个内外一致,我有点说不清,给个链接吧,感觉说的比较到位
http://www.blogjava.net/DLevin/archive/2011/11/23/364599.html
因为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关键字定义的变量是存在运行时常量池里的,不是存在栈里的,所以存活时间较长。