在java中使用接口的原因是什么?

时间:2014-08-30 14:24:43

标签: java android

今年夏天我刚学了一些java课,一切都很顺利,但我被困在界面。我知道接口允许我们使用像文件这样的类对方法进行分组,但是我们什么时候才能在实际编程中使用它。我有点困惑。定义的例子将不胜感激。

3 个答案:

答案 0 :(得分:3)

  

interface允许我们使用类似文件的类

对方法进行分组

界面是合约。它缺乏实施,缺乏方法。但它指明了什么。

这样做的好处是,它使我们能够交换进出不同的实现(或解决方案),而无需将更改级联到所有使用该接口的位置。

例如,在JDK库中查看。它们提供了List接口,以及几种提供不同实现的替代实现,这些实现在不同情况下更好。例如,LinkedList和ArrayList都实现了List,但它们的执行方式却截然不同。有时LinkedList比ArrayList更好,有时反之亦然。

答案 1 :(得分:1)

  

但我们什么时候真正开始在实际编程中使用它。

对我而言,我一直使用的最简单,最好的方法是在callback pattern

中大多数情况下使用的Listener callback pattern

以下是interface CallBack { void methodToCallBack(); } class CallBackImpl implements CallBack { public void methodToCallBack() { System.out.println("I've been called back"); } } class Caller { public void register(CallBack callback) { callback.methodToCallBack(); } public static void main(String[] args) { Caller caller = new Caller(); CallBack callBack = new CallBackImpl(); caller.register(callBack); } }

的简单示例
// Reverse geocoding may take a long time to return so we put it in AsyncTask.
public class ReverseGeocoderTask extends AsyncTask<Void, Void, List<Address>> {
    private static final String TAG = "ReverseGeocoder";

    private Geocoder mGeocoder;
    private float mLat;
    private float mLng;
    private Callback mCallback;
    public ReverseGeocoderTask(Geocoder geocoder, float[] latlng,
            Callback callback) {
        mGeocoder = geocoder;
        mLat = latlng[0];
        mLng = latlng[1];
        mCallback = callback;
    }
    @Override
    protected List<Address> doInBackground(Void... params) {
        List<Address> address = null;
        try {
            List<Address> address =
                    mGeocoder.getFromLocation(mLat, mLng, 1);

        } catch (Exception ex) {
           // ignore
        } 
        return address;
    }
    @Override
    protected void onPostExecute(List<Address> address) {
        if(address != null)
           mCallback.onComplete(address);
    }
}

// the interface
public interface Callback {
   public void onComplete(List<Address> address);
}

// example fragment

public class MyCallbackFragment extends Fragment implements Callback{

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       setContentView(R.layout.fragment_layout);
       // params the geocoder, float[] latlng, and the class that implements Callback
       new ReverseGeocoderTask(new Geocoder(getActivity(), Locale.getDefault()) , latlng, this).execute(null,null,null);
   }
  ...

  @Override
  public void onComplete(List<Address> address){
         // now we can get the address not interupting the main thread 
         // and also let the Task call us back to retrieve the information
         // and use it.

         // you can then use the address to display it anywhere you want in your UI



  }
}

以更具体的方式:

Interface

我已经将这种模式用于出租车/出租车应用程序的地理位置,所以我自己拿取它时不会处理它而是让它给我打电话并发送给我我需要的东西,如果不是null < / em>的

但这不是你唯一应该注意的事情。您可以通过多种方式使用它。

来自文档: Java中的接口

在Java编程语言中,接口是一种类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。方法体仅适用于默认方法和静态方法。接口无法实例化 - 它们只能由类实现或由其他接口扩展。

进一步阅读here

希望它能让您对{{1}}

有所了解

答案 2 :(得分:0)

从我的角度来看,界面表示要在某个特定时间执行的操作。

例如,在按下硬件键时调用onKeyDown接口。这里“按下”是一个特定的时间,那么我们当时该怎么做?只需致电onKeyDown即可!

另一个优点是,通过接口我们不需要知道真正的类实例是什么,我们知道有一个我们可以调用的方法就足够了。