Java基础:接口概念的理解      
View on GitHub

龙珠

修炼自己与发现世界

Java基础:接口概念的理解

By arthur503 -- 07 Oct 2013

以前虽然知道接口,但没有理解它的作用到底在哪里。今天查看数据容器的时候,在《Java编程思想》CH11.2里介绍如何创建List接口,才发现接口的妙用,因此记下来在这里。当然很有可能这只是接口的一种用法,等以后再看到其他用法再来补充。

首先说一下接口的语法定义:

  1. 接口中所有方法都不能被实例化(与abstract class不同。详见另一篇博文:),即:所有方法最后没有大括号;
  2. 接口中一般不包含成员变量。如果包括,则默认为public static final类型,必须被初始化;

一、容易修改

使用接口的目的在于:如果你决定去修改你的实现,你所需的只是在创建处修改它。例如,使用ArrayList创建List接口时,代码如下:

List<Apple> apples = new ArrayList<Apple>();

那么,如果想要更改为使用LinkedList实现的时候,我们只需要在创建处,将代码修改为:

List<Apple> apples = new LinkedList<Apple>();

即可。

这样,对于有统一接口的需求来说,只需要创建一个具体类的对象,将其向上转型为对应的接口,然后在其余代码中使用这个接口所提供的方法即可。如果需要修改为另一种具体实现,只需要在创建处进行修改即可,无需对全局代码进行改动。真是方便快捷!

当然,这种方式并不是所有情况下都奏效。因为某些类具有特殊的功能,比如,LinkedList具有在List接口中未包含的方法,而TreeMap也具有在Map中未包含的方法。如果在工程中,需要使用这些方法,就不能将他们向上转型为更通用的接口。

二、容易创建/解耦和

在《Java编程思想》P239中有写到:

使用接口描述的一个理由是它可以使我们能够创建更通用的号码。通过针对接口而非具体实现来编写代码,我们的代码可以应用于更多的对象类型。

因此,如果我编写的方法将接受一个Collection,那么该方法就可以应用于任何实现了Collection的类————这也就使得一个新类可以选择区实现Collection接口,以便我的方法去使用它。

和这个相似的是标准C++类库中的迭代器,迭代器在Java中也实现了。

或者使用foreach语句,可以使代码更清晰。

参考资料: