当您声明接口的新实例时会发生什么:
OnClickListener oc = new OnClickListener(){
@Override
public void onClick(View v){
//Something
}
};
方法onClick
存储在哪里?它一定是某种类的班级存储?这是否意味着该语法会创建一个未命名的类并隐式地实现其界面?如果是这样,如何将不同的OnClickListener
对象彼此分配?当然,由于它们是"隐式"类型的"隐式"类型,因此两种不同类别的分配是不可能的。
有人可以解释吗?
它称为匿名类。
如果您的代码在文件Foo.java
中,并且您对其进行了编译,则第一个匿名类将获得Foo.class
和Foo$1.class
。( Foo$2.class
等用于更多匿名类)。
OnClickListener oc = new OnClickListener(){
@Override
public void onClick(View v){
//Something
}
};
是Java中的匿名类。您正在创建匿名类(没有类名)实现您的您的 onclicklistener 。因此,您的方法 onclick()在您的接口 onclicklistener 内定义的方法在此处暗示。
这里发生的事情是,您正在Java中创建一个实现OnClickListener接口的"内部匿名类"。这会导致oc参考变量参考实例化产生的对象(这就是ONCLICK方法的实现的位置)。
这种类型的分配是完全有效的,可以将OC引用变量分配给ONClickListener实现的另一个实例,因为它们俩都是相同的类型(实现了相同的接口),在这种情况下,原始的"匿名内部类"将由于对其有"零"引用,因此符合垃圾收集的资格。
欢呼;hass。