您可以还是不能实例化接口?

问题描述

不确定我是否了解。.有人告诉我不能实例化一个接口,但是当我使用LocationListener接口时,我会写:

{{1}}

这按预期工作,但这不是实例化接口吗?我不太确定我能明白...

解决方法

阐述安迪的评论:

如果您写类似

final int myLocal = ...;
locationListener = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        doSomething(myLocal);
    }
};

这是简写

class YourClassName$1 implements LocationListener {
    private final YourClass enclosingInstance;
    private final int myLocalCopy;
    YourClassName$1(YourClass enclosingInstance,int myLocal) {
        this.enclosingInstance = enclosingInstance;
        this.myLocalCopy = myLocal;
    }
    @Override
    public void onLocationChanged(Location location) {
        doSomething(myLocalCopy);
    }
}

然后

final int myLocal = ...;
locationListener = new YourClassName$1(this,myLocal);

(我使用的名称可能与您的编译生成的名称不匹配)

该速记方式会静默编译为一个新类(名称对于常规Java源代码而言是非法的)并实例化该类,然后通过构造函数参数将封闭的实例(以及方法中引用的任何局部变量)传递到新实例中。

所以,这是一个普通的旧类,需要实例化,而不是接口,只有该类不是您自己编写的,而是在编译这种语言构造时由编译器以静默方式编写的。