JavaRush /Java 博客 /Random-ZH /什么是接口
fog
第 18 级

什么是接口

已在 Random-ZH 群组中发布
接口是描述某些行为的公共的、普遍接受的契约(协议)。需要它们做什么?例如,假设我们有一个指向字符串列表的链接。假设一开始向这个列表添加了很多元素,然后将整个列表处理一次。假设我们决定遵循众所周知的建议并使用该类ArrayList
ArrayList<String> list = new ArrayList<>();
我们用这个字符串列表编写了 100,500 行代码的程序行为,并使用特定于类的方法来优化性能ArrayList。例如EnsureCapacity()。只要将这些行添加到列表的末尾,一切都会正常快速地运行。但现在我们需要将程序重新定位为稍微不同的工作类型,其中行主要添加到列表的开头。对于这种类型的负载来说它更合适LinkedList。但是如果我们想将我们的100,500行代码的程序翻译到rails上LinkedList,那么我们将需要找到并删除特定ArrayList方法的使用,也许在某些地方极大地改变了程序各个部分的逻辑。ArrayList如果我们只使用和 中都可用的那些方法LinkedList,那么我们就不必这样做。我们只需更改一行代码 - 列表声明:
LinkedList<String> list = new LinkedList<>();
我们可以注意到,将这些类的公共方法的声明放在祖先类中会更方便,例如可能是抽象类AbstractList。在这种情况下,我们可以这样声明我们的列表:
AbstractList<String> list = new ArrayList<>();
我们可以像这样快速切换实现:
AbstractList<String> list = new LinkedList<>();
但在这种情况下,我们在程序中可以使用的类仅限于该类的后代AbstractList,即使有更合适的类不是该类的后代AbstractList,但具有相同的方法和相同的行为。我应该怎么办?这就是发明接口的原因。接口是关于一组方法及其行为的约定,完全不相关的类可以提交这些方法,从而允许通过单个引用来引用它们中的任何一个。例如这样:
List<String> list;
list = new ArrayList<>();
list = new LinkedList<>();
list = new AnotherListClass<>();
即使AnotherListClass类没有共同的祖先类,ArrayList除了. 界面的一个很好的例子是汽车的转向——汽车有方向盘、踏板和变速箱。在绝大多数汽车中,这些元素遵循相同的行为惯例。例如,如果逆时针转动方向盘,无论其品牌如何,汽车都会向左转而不是加速。如果您知道如何使用这些控件,您就可以轻松操控任何汽车,无论其型号、年份、品牌或发动机类型如何。此外,我们可以想象一种情况,一种完全不同类型的交通工具(例如宇宙飞船)具有与汽车相同的控制界面。如果您知道如何驾驶汽车,并发现自己坐在这样一艘船的驾驶座上,您将能够避免在这种情况下迷路。让我们再重复一遍:LinkedListObject
  • 接口是关于行为的契约(协议)。
  • 许多类,甚至那些不通过继承相关的类,都可以声明它们同意遵守此契约(接口实现)。
  • 将行为描述放在单独的接口中非常方便,因为它增加了代码的灵活性,允许您将接口的实现(实现接口的类)切换到不通过继承相关的类。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION