匿名类和final外部变量的实现
来源:互联网 发布:武汉大学网络管理中心 编辑:程序博客网 时间:2024/06/05 11:32
我们知道,在java中有大量的匿名类使用,而且在匿名类的函数中,我们还可以使用在外部声明的final变量,例如下面的android代码:
我们为Button arrowTop创建了一个listner,在内部类的onClick函数中,又使用了arrowTop这个final变量。
public class ArrowPopupWindowDemo extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.arrow_popup_window); final Button arrowTop = (Button) findViewById(R.id.arrow_top); arrowTop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final ListPopupWindow popup = new ListPopupWindow(ArrowPopupWindowDemo.this); popup.setAdapter(createAdapter()); popup.setAnchorView(arrowTop); popup.setWidth(400); popup.setModal(true); popup.setListSelector(getResources().getDrawable(android.R.color.transparent)); popup.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { popup.dismiss(); } }); ArrowPopupWindow popupWindow = popup.getPopupWindow(); popupWindow.setTitle(R.string.arrow_top); popupWindow.setPositiveButton(android.R.string.ok, null); popupWindow.setNegativeButton(android.R.string.cancel, null); popup.show(); } }); } .....}
我们为Button arrowTop创建了一个listner,在内部类的onClick函数中,又使用了arrowTop这个final变量。
我们知道,内部匿名类也是一个单独独立的类,会别java编译器生成一个 <外部类名>$<N>的方式。这个例子里面,就是ArrowPopupWindowDemo$1。我们来反编译它的class,得到如下的信息
Compiled from "ArrowPopupWindowDemo.java"class com.example.miui.widget.popupwindow.ArrowPopupWindowDemo$1 implements android.view.View$OnClickListener { final android.widget.Button val$arrowTop; final com.example.miui.widget.popupwindow.ArrowPopupWindowDemo this$0; com.example.miui.widget.popupwindow.ArrowPopupWindowDemo$1(com.example.miui.widget.popupwindow.ArrowPopupWindowDemo, android.widget.Button); Code: 0: aload_0 1: aload_1 2: putfield #1 // Field this$0:Lcom/example/miui/widget/popupwindow/ArrowPopupWindowDemo; 5: aload_0 6: aload_2 7: putfield #2 // Field val$arrowTop:Landroid/widget/Button; 10: aload_0 11: invokespecial #3 // Method java/lang/Object."<init>":()V 14: return ....根据反编译结果可以看到,java编译生成了两个隐含的域:val$arrowTop和 this$0,对应的就是外部的final arrowTop变量和外部的this变量,而且还为它创建了一个隐含的构造函数。这个构造函数也是隐含调用的,由编译器自动产生。
0 0
- 匿名类和final外部变量的实现
- 转载:内部匿名类使用外部方法的变量,该变量必须为final
- 匿名内部类使用的外部变量为什么要是final
- 为什么匿名内部类中用外部类的成员变量,外部类的成员变量必须是final
- java 匿名类访问外部变量要使用final
- [Java] 匿名内部类访问外部类的局部变量为什么一定得是final类型
- 【面试对宝典40题的解释】匿名内部类访问外部类中的局部变量必须是final属性
- 匿名内部类使用的外部变量为什么要是final的
- 匿名内部类使用外部的局部变量时为什么一定要final修饰
- 匿名内部类 使用外部的变量为什么要声明成final
- 匿名内部类 使用外部的变量为什么要声明成final
- 匿名内部类访问外部类中的局部变量必须是final属性
- 匿名内部类访问外部类中的局部变量必须是final属性
- 匿名内部类访问外部类中的局部变量必须是final属性
- Java匿名内部类访问外部类局部变量,为何需被标志为final?
- 匿名内部类引入外部变量必须是final?
- 使用匿名内部类,隐式调用外部变量,外部变量需要final修饰
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- JS学习-JS简介
- java泛型详细解读----学习笔记
- Struts2 HTTP对象传递
- [转]Ceph:OpenStack标配&Linux PB级分布式文件系统详解
- iOS 开发类库 [转帖自 code4app]
- 匿名类和final外部变量的实现
- 共同学习Java源代码--数据结构--AbstractList抽象类(三)
- 谨此:献给没有离婚的家庭
- ACM--1334 好老师--湖南省第九届省赛--水
- commons-pool源码分析总结
- 项目中常用的设计模式
- 【裸奔吧linux】vmstat:一个系统监控工具,常用于性能分析
- 做一个努力的人
- word的一些常用功能