当您按如下方式声明接口的新实例时会发生什么:
OnClickListener oc = new OnClickListener(){
@Override
public void onClick(View v){
//Something
}
};
方法onClick
存储在哪里?它必须在某种类存储中?这是否意味着此语法创建一个未命名的类并隐式实现OnClickListener接口?如果是这样,你怎么能为彼此分配不同的OnClickListener
个对象?当然,因为它们是“隐含的”不同的类类型,所以不可能分配两个不同的类。
有人可以解释一下吗?
答案 0 :(得分:4)
它被称为匿名类。
如果您的代码位于文件Foo.java
中,并且您已编译它,则第一个匿名类将获得Foo.class
和Foo$1.class
。 (Foo$2.class
等等,以获得更多匿名类。)
答案 1 :(得分:2)
OnClickListener oc = new OnClickListener(){
@Override
public void onClick(View v){
//Something
}
};
是java中的匿名类。您正在创建一个匿名类(没有类名) 实现 OnClickListener 。所以你的方法 onClickListener 中定义的方法 OnClick()正在这里实施。
答案 2 :(得分:1)
这里发生的事情是你在java中创建一个实现OnClickListener接口的“内部匿名类”。这导致oc引用变量引用实例化产生的对象(那就是onClick方法的实现)。
这种类型的赋值完全有效,oc引用变量可以分配给OnClickListener的另一个实现实例,因为它们都是相同的类型(实现相同的接口),在这种情况下原始的“匿名内部类”将有资格进行垃圾收集,因为它有“零”引用。
干杯; 哈斯。