什么是interface?

你可能在日常生活中经常见到USB口(USB interface)。不论是优盘、移动硬盘、数码相机还是手机都会用到这种接口。USB口可以让你把外部设备和电脑连接起来以双向传输数据或文件。在使用完成之后,可以将设备弹出并拆下连接线,有必要时再连上新的设备。

在Java中,interface可以被视为一种特殊的class,里面一般只有public abstract method。abstract method仅有签名而没有具体的代码实现。在定义好interface之后,你就确定了某个class为实现(implement)这个interface需要完成哪些工作。对于interface List而言,它的某个实现要能够在列表中添加元素、删除元素、获取指定索引的元素等等。思路是为了将某个class的object所能完成的工作,和具体由谁(哪个class)来完成分离开。这样一来,你就可以创建一系列的class来实现同一个interface,然后按需选用。你可以在程序中接驳不同的class,就像你在电脑上插入不同的USB设备那样。

interface与合同

你还可以把interface想成一种合同。实现某个interface的class同意为interface中定义的method提供对应的代码。想象某个公司为自己的产品设计了interface,规定了其拥有的一系列功能,代工厂则可以提供不同的方案来实现这些功能。你可以选用不同的代工厂的实现方案,因为就同一个interface而言所涉及的method均是一致的。按照你自己的使用场景,可以从一个解决方案切换到另外一个,直至找到最合适的。能够在不修改代码的前提下切换class使得interface变得极为有用。

考试中的List method

以下是你在AP计算机科学A考试中会用到的List method。它们也会在AP计算机科学考试的快速参考中提供。

注意到interface Listadd method只接受object并将其加入列表中。列表只能存储object而非像double或者int之类的基本变量。所有这些基本变量必须通过自动装箱(autoboxing)的过程来转换成Java object。int对应Integerdouble对应Double等等。

为何使用列表?

我们之前刚学了数组,那么为什么在某些情况下列表相对数组更有优势呢?事实上为了把元素存放到数组里,需要先对元素的数目有大致的估计。假定你已经创建了一个长度为5的数组,想要加入第6个元素时会发生什么事?你就不得不创建一个更大的数组,再将老元素一一复制过去并把新元素追加在最后。新数组的大小又应该设为多少呢?如果是6的话暂时不会浪费更多空间,但是如果之后还要再追加元素的话就又得重复“创建/复制”这个过程。如果你新建了一个更大的数组(一般为原来数组大小的两倍),你又得另行记录数组中到底存有多少个有效元素,因为这样一来数组大小和元素数目就不一致了。


陈 欣

AADPS创始人

发表评论