关于Android(JAVA)实例化接口假象的讨论
2016-02-08 19:30
471 查看
关于Android(JAVA)实例化接口假象的讨论
我们都知道,java中抽象类和接口都是不能实例化的,但是,在写android代码时,我们肯定经常看到这样的代码:view.setOnClickListener(new View.OnClickListener{ @Override public void onClick(View v) { } });
不是说好不能实例化的么,那这个是神马东东
别急,咱们继续看,不放运行一下我们的程序
如下:我们有一个简单的testActivity,代码如下:
public class test extends AppCompatActivity{ @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); setContentView(R.layout.test); findViewById(R.id.test).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } }
界面上仅仅有一个button,我们运行一下,然后看看build下面的class文件
我们编译后,打开我们的编译输出路径(在下用的是as,路径如下:app->build->intermiediates->classed->debug->[包名]->.class)
如图:
打开后我们就发现我们的java一共编译出两个class文件
分别是test.class和test1.class(抱歉,markdown没法打出那个符号),很明显,test1.class是test的内部类,我们都知道,接口是无法实例化的,但可以通过类来实现,于是我们把test1.class扔到http://www.showmycode.com/查看,出现以下代码:
到这里,我们就很明朗了,看起来是new了一个接口,实际上是编译的时候自动帮我们new了一个匿名内部类来实现这个接口,而不是我们看起来那样的“反规则”
相关文章推荐
- Android 主题和选择器
- Android-x86 4.4-r5 发布,PC 上的安卓系统
- Android线程池
- Android报错:Your content must have a ListView whose id attribute is 'android.R.id.list'
- Android图像单位转换
- 炉石传说斩杀计算器-Android
- Android RemoteViews 11问11答
- ANDROID_MARS学习笔记_S01_005CheckBox
- ANDROID_MARS学习笔记_S01_004dpi、dp(dip)及计算
- Intent(意图)转跳页面
- View的工作原理 - Android开发艺术探索读书笔记(第四章)
- Android TimePickerDialog两次执行onTimeSet问题
- android数据存储的四种方案(三)
- android Studio keytool' 不是内部或外部命令,也不是可运行的程序 或批处理文件
- Android项目中的DAO
- android如何根据一个String来级联ListView
- android日常开发总结的技术经验60条
- Android对话框自定义标题
- Android应用:StatusBar状态栏、NavigationBar虚拟按键栏、ActionBar标题栏、Window屏幕内容区域等的宽高
- Android应用:StatusBar状态栏、NavigationBar虚拟按键栏、ActionBar标题栏、Window屏幕内容区域等的宽高