此代码如何能够从接口实例化新对象?



在我的CS110课上,我们正在开发一个使用Google Maps API的Android应用程序,其中一个概念是观察者设计模式。设计模式教授发布者和订阅者的概念。因此,当发布者的状态更改时,它会通知所有订阅者。在此示例中,LocationListener 是订阅者,但实现令人困惑。

代码片段如下所示:

LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
makeUseOfNewLocation(location);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};

LocationListener是一个接口,我的理解是你不能实例化一个接口。然而,LocationListener locationListener...语句是从Interface创建一个对象,这怎么可能?

另外,我的理解是这是一个匿名类。我不太确定我是否理解匿名类的含义。我理解匿名这个词的意思,但不是在类的上下文中。

任何帮助澄清这里发生的事情将不胜感激。

这是来自Oracle Java官方网站的链接,其中包含对"匿名内部类"的良好解释,这就是您所指的:http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html

另外,这里有一个很好的链接,指向关于堆栈溢出的类似问题:如何在Java中使用匿名(内部)类?

LocationListener是一个接口!

locationListener不是对象,而是类LocationListener的引用

在你的代码中,你正在做的是:

您正在创建类 LocationListener 的引用。如果类A实现接口B则接口 B 的引用可以保存类A的对象。你在做同样的事情。

匿名类是一个没有显式声明和定义的类。所以在这一部分

new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
makeUseOfNewLocation(location);

您正在定义一个实现接口LocationListener的匿名类!

因此,引用locationListener保存该匿名类的对象!

希望这能解释你的问题!!

最新更新