咨询个内部类的问题

reprosper 2013-04-09 12:58:05
疯狂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按钮被单击了!");
}
});
}
}
...全文
234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Njdezhang 2013-04-09
  • 打赏
  • 举报
回复
这主要是由存活时间决定的。 因为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关键字定义的变量是存在运行时常量池里的,不是存在栈里的,所以存活时间较长。
摆烂办不到 2013-04-09
  • 打赏
  • 举报
回复
个人理解:如果show用final修饰的话。。刚代码第3行EditText show;就应该初始化,代表show为常量,否则会报错。
LCore 2013-04-09
  • 打赏
  • 举报
回复
引用 4 楼 reprosper 的回复:
引用 1 楼 duxingzhe0311 的回复:如果把它写在onCreate方法里,就需要是final了。 注意到这个问题了,但为什么写在外面就不用final了呢?
这个问题对于我等菜鸟来说还是有点难以讲清楚的 对于外部类的成员变量不用添加final这个很容易知道 因为内部类保存了外部类的引用,内部类对其的修改都会真实 的反映到外部类的实例上! 至于onCreate方法中必须使用final是为了保持内外一致! 怎么个内外一致,我有点说不清,给个链接吧,感觉说的比较到位 http://www.blogjava.net/DLevin/archive/2011/11/23/364599.html
rockets311 2013-04-09
  • 打赏
  • 举报
回复
http://blog.csdn.net/axman/article/details/1460544
reprosper 2013-04-09
  • 打赏
  • 举报
回复
引用 1 楼 duxingzhe0311 的回复:
如果把它写在onCreate方法里,就需要是final了。
注意到这个问题了,但为什么写在外面就不用final了呢?
「已注销」 2013-04-09
  • 打赏
  • 举报
回复
如果show是final,需要在属性或者构造方法里初始化。
FunnyRabbit87 2013-04-09
  • 打赏
  • 举报
回复
不好解释。你可以看看Think in java 第四版,第198页
rockets311 2013-04-09
  • 打赏
  • 举报
回复
如果把它写在onCreate方法里,就需要是final了。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧