3

如下声明接口的新实例时会发生什么:

OnClickListener oc = new OnClickListener(){
    @Override
    public void onClick(View v){
         //Something
    }
};

方法onClick存储在哪里?它必须在某种类存储中?这是否意味着该语法创建了一个未命名的类并隐式实现了 OnClickListener 接口?如果是这样,你怎么能将不同的OnClickListener对象分配给彼此?当然,由于它们是“隐式”不同的类类型,因此不可能分配两个不同的类。

有人可以解释一下吗?

4

3 回答 3

4

它被称为匿名类

如果你的代码在 File 中Foo.java,并且你编译它,你会得到Foo.classFoo$1.class一个匿名类。(Foo$2.class等等更多匿名类)。

于 2012-11-10T00:27:24.287 回答
2
OnClickListener oc = new OnClickListener(){
    @Override
    public void onClick(View v){
         //Something
    }
};

是java中的一个匿名类。您正在创建一个实现OnClickListener匿名类(没有类名)因此,在您的接口onClickListener中定义的方法OnClick()正在此处实现。

于 2012-11-10T00:28:08.017 回答
1

这里发生的事情是您正在 java 中创建一个实现 OnClickListener 接口的“内部匿名类”。这导致 oc 引用变量引用由实例化产生的对象(这就是 onClick 方法的实现所在的位置)。

这种类型的赋值是完全有效的,可以为 oc 引用变量分配 OnClickListener 实现的另一个实例,因为它们都是相同的类型(实现相同的接口),在这种情况下,原始的“匿名内部类”将有资格垃圾收集,因为对它的引用“零”。

干杯; 哈斯。

于 2012-11-10T00:41:00.753 回答