Java新的接口实例语法 - 发生了什么?

时间:2012-11-10 00:25:35

标签: java interface

当您按如下方式声明接口的新实例时会发生什么:

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

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

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:4)

它被称为匿名类

如果您的代码位于文件Foo.java中,并且您已编译它,则第一个匿名类将获得Foo.classFoo$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的另一个实现实例,因为它们都是相同的类型(实现相同的接口),在这种情况下原始的“匿名内部类”将有资格进行垃圾收集,因为它有“零”引用。

干杯; 哈斯。