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



当您声明接口的新实例时会发生什么:

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

方法onClick存储在哪里?它一定是某种类的班级存储?这是否意味着该语法会创建一个未命名的类并隐式地实现其界面?如果是这样,如何将不同的OnClickListener对象彼此分配?当然,由于它们是"隐式"类型的"隐式"类型,因此两种不同类别的分配是不可能的。

有人可以解释吗?

它称为匿名类

如果您的代码在文件Foo.java中,并且您对其进行了编译,则第一个匿名类将获得Foo.classFoo$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。

最新更新