接口(Interface)的深入理解

Posted littlelittleprince

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口(Interface)的深入理解相关的知识,希望对你有一定的参考价值。

接口(Interface)的深入理解

一:接口是规范(不展开)

二:接口可以看成是一个特殊的类

1: 接口可以定义“接口类型变量”,就好像类可以定义类类型的变量(或者说是引用类型变量)。申明一个类类型的变量,然后我们通常使用构造器创建对象,并把该对象赋值给类类型的变量(或者说引用变量引用到我们创建的对象)。这样,我们就可以通过类类型的变量来操作我们实际new出来的对象。于此类似的,我们也可以创建接口类型的变量(或者说是接口类型的引用变量),并把一个实现了该接口的实现类的对象赋值给接口类型的引用变量(或者说接口类型的引用变量引用到该接口实现类的对象)。通过接口类型的变量,我们便可以调用实现了该接口的类的对象。从这看出,类和接口有相似的地方。它们都有多态的存在

代码如下

 技术分享图片

 

2:接口类型的引用变量,我们可以传一个实现该接口抽象方法的匿名内部类(匿名内部类会创建一个实现一个该接口抽象方法的对象)。本质上来说,还是通过接口类型的变量,来调用实现该接口创建出来的对象实例

代码如下

技术分享图片

 

 

三: 接口可以理解为是一个功能模块

我们自己写的类通过实现Java提供的相应的接口,并重写接口的抽象方法,就可以得到我们想要的功能

举个例子

TreeSet是SortSet的子类,这意味着存入TreeSet的元素(对象),必须要有一个比较大小的方法,否者TreeSet无法保证元素是有序存放的

假设我们存放的是Person类的对象。Person类有name(String),age(int),两个成员变量。我们必须确保TreeSet有一个比较Person类的实例对象的方法

我们用先比较名字的字母顺序,在来比较年龄的大小的方法来排序

在这里我们可以有两种选择

实现Comparable接口,或者实现Comparator接口

先来使用Comparable接口

Person类实现Comparable接口,并重写compareTo()方法(原因:TreeSet在添加对象时,会调用对象的compareTo()来比较对象的大小)

代码如下

技术分享图片

技术分享图片

技术分享图片

注:上述代码没有实现泛型

再来使用Comparator接口来实现

代码如下

技术分享图片

 

技术分享图片

结果相同

至于为什么要把Comparator的comparator作为参数传入TreeSet()构造器中,本人也是小白。我目前也不清楚

有人知道的话,可以说一下

 

以上是关于接口(Interface)的深入理解的主要内容,如果未能解决你的问题,请参考以下文章

深入理解设计模式(20):桥接模式

深入delphi编程理解之接口接口与类的异同及接口的声明和实现

深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP

深入理解abstract class和interface

深入理解abstract class和interface

深入理解golang