Java中的这种代码结构是什么?

Java中的这种代码结构是什么?,java,android,Java,Android,有人能给我解释一下这是什么类型的结构吗?我正在使用Google Location,当我面对以下代码时,我很感兴趣: private LocationCallback locationCallback; public final void readyToUpdateLocation() { locationCallback = new LocationCallback() { public void onLocationAvailability(Locati

有人能给我解释一下这是什么类型的结构吗?我正在使用Google Location,当我面对以下代码时,我很感兴趣:

private LocationCallback locationCallback;
public final void readyToUpdateLocation() {
        locationCallback = new LocationCallback() {
            public void onLocationAvailability(LocationAvailability p0) {
                //do sth here...    
            }

            public void onLocationResult(LocationResult locationResult) {
                //do sth here....
            }
        };
    }

public final void startLocationUpdates() {
        try {
            FusedLocationProviderClient providerClient = this.fusedLocationClient;
            providerClient.requestLocationUpdates(this.locationRequest, this.locationCallback, null);
        } catch (Exception var2) {
            Handle(car2);
        }
    }


如您所见,这不是一个抽象类,也不是要重写的接口。没有覆盖关键字。那么这是什么呢?

匿名类中缺少重写

locationCallback = new LocationCallback() {
        @Override
        public void onLocationAvailability(LocationAvailability p0) {
            //do sth here...    
        }

        @Override
        public void onLocationResult(LocationResult locationResult) {
            //do sth here....
        }
    };
现在该类用于异步使用:稍后调用这两个方法,并在这两个事件上调用提供程序

但是,如果提供者对可用性或结果不感兴趣,则不需要重写不需要的回调方法


如果只有一个回调,通常使用接口而不是类。

这是一个匿名类。当您只想重写非抽象类的某些方法时,可以使用匿名类来扩展这些类。它不仅限于接口和抽象类

LocationCallback是一个遵循“基本实现”的常规逻辑的类。通常,原则是定义一个接口:

interface LocationCallback {
  void onLocationResult(LocationResult var1);
  void onLocationAvailability(LocationAvailability var1);
}
但是,由于此接口定义了两个方法,并且您可能只对提供的两个事件中的一个事件感兴趣,因此要求所有用户在每次对其中一个事件做出反应时都为这两个方法提供实现的工作量太大了

为了减少工作量,通常会提供一个基类来实现接口的所有方法,并使它们不做任何事情:

public class BaseLocationCallBack implements LocationCallBack {
    @Override
    public void onLocationResult(LocationResult var1) {
    }

    @Override
    public void onLocationAvailability(LocationAvailability var1) {
    }
}
这样,回调的用户就可以简单地扩展BaseLocationCallBack,只覆盖他们想要覆盖的方法。使事情更简单


在您的例子中,他们完全跳过了定义接口,只定义了零实现的基类。这也行。

这似乎是一个匿名类(我想)。通常,我希望看到
locationCallback
被绑定到某个Google对象,该对象随后会在某个时候使用它。@TimBiegeleisen是的,当我编辑我的问题时,它被绑定到方法中的一个对象。此类用于从Google fused location服务获取回调结果。用户已传递回调机制以获取回调并使用它。为多用途而创建单独的类。有关此语法的解释,请参见此处:您可以将其视为一个类的动态自定义实例化,而实际上不存在正式的类文件。你会在Android中经常看到这些回调。是的,没关系。但是没有@Override。它们只是简单的方法。但是,它们会覆盖它们的父对象!或参考!班级。我不知道该怎么称呼那个班;)LocationCallback是基类,这些方法实际上覆盖基类版本。您应该有一个缺少覆盖的警告。在Java中引入像
@Override
这样的注释之前,重写的方法名中的一个输入错误将导致在没有任何提示的情况下无法调用它。
public class BaseLocationCallBack implements LocationCallBack {
    @Override
    public void onLocationResult(LocationResult var1) {
    }

    @Override
    public void onLocationAvailability(LocationAvailability var1) {
    }
}