在我的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
保存该匿名类的对象!
希望这能解释你的问题!!