实现接口和创建它的实例之间的区别

Difference between implementing an interface and creating an instance of it

我想知道实现接口和创建它的实例有什么区别,这里是一个代码示例,这段代码允许使用 ResultReceiver 在 IntentService 和 Activity 之间进行通信。

MySimpleReceiver Class :

public class MySimpleReceiver extends ResultReceiver {

public static final Creator CREATOR = null;
private Receiver receiver;

// Constructor takes a handler
public MySimpleReceiver(Handler handler) {
    super(handler);
}

// Setter for assigning the receiver
public void setReceiver(Receiver receiver) {
    this.receiver = receiver;
}

// Defines our event interface for communication
public interface Receiver {
    void onReceiveResult(int resultCode, Bundle resultData);
}

// Delegate method which passes the result to the receiver if the receiver
// has been assigned
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
    if (receiver != null) {
        receiver.onReceiveResult(resultCode, resultData);
    }
}
}

这是在从服务接收数据时设置回调的最佳方式:

在 MainActivity 中实现 MySimpleReceiver.Receiver 接口:

public class MainActivity extends Activity implements MySimpleReceiver.Receiver 

    {

        @Override
        public void onReceiveResult(int resultCode, Bundle resultData) {
            //
        }
    }

或者在 MainActivity:

中创建接口实例
public class MainActivity extends Activity {


    public MySimpleReceiver receiverForSimple;


    // Setup the callback for when data is received from the service
    public void setupServiceReceiver() {
        receiverForSimple = new MySimpleReceiver(new Handler());
        // This is where we specify what happens when data is received from the
        // service
        receiverForSimple.setReceiver(new MySimpleReceiver.Receiver() {
            @Override
            public void onReceiveResult(int resultCode, Bundle resultData) {
                if (resultCode == RESULT_OK) {
                    String resultValue = resultData.getString("resultValue");
                    Toast.makeText(MainActivity.this, resultValue, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

}

和有什么区别?谢谢

您不能 "create an instance" 接口,只能 class 实现它的实例。

接口只不过是一个紧密绑定的契约,您必须完全实现它。

class 是一个已实现的功能。

您提供的示例表明您正在 匿名 class 中覆盖 MySimpleReceiver.Receiver。看起来你正在实例化一个接口,但你不是。此 class 没有名称(因此是匿名的),但它的 实现 包含在新语句后的大括号中。

匿名 classes 非常有用,但难以阅读,特别是如果您习惯了旧版本的 Java 或其他不支持此类代码的语言。

请参阅the tutorial on anonymous classes here

如果您想以任何方式重用 class,您可以使用第一个示例(直接实现)。不过,它会使您的解决方案更大一些。

如果您只使用一次并且不希望在您的解决方案中增加 class 个文件,那么第二个示例非常好。

您无法创建接口实例。 您只能创建实现该接口的 class 实例。 示例:

interface Calculate{
    void doCalculation();
}

class Sample implements Calculate{
   @Override
   void doCalculation(){
   //TODO Write your code to calculate
  }
}

//=======================================//

Calculate calculate = new Sample();
calculate.doCalculation();