接口(Interface)的深刻理解spa
一:接口是规范(不展开)对象
二:接口能够当作是一个特殊的类blog
1: 接口能够定义“接口类型变量”,就好像类能够定义类类型的变量(或者说是引用类型变量)。申明一个类类型的变量,而后咱们一般使用构造器建立对象,并把该对象赋值给类类型的变量(或者说引用变量引用到咱们建立的对象)。这样,咱们就能够经过类类型的变量来操做咱们实际new出来的对象。于此相似的,咱们也能够建立接口类型的变量(或者说是接口类型的引用变量),并把一个实现了该接口的实现类的对象赋值给接口类型的引用变量(或者说接口类型的引用变量引用到该接口实现类的对象)。经过接口类型的变量,咱们即可以调用实现了该接口的类的对象。从这看出,类和接口有类似的地方。它们都有多态的存在排序
代码以下接口
2:接口类型的引用变量,咱们能够传一个实现该接口抽象方法的匿名内部类(匿名内部类会建立一个实现一个该接口抽象方法的对象)。本质上来讲,仍是经过接口类型的变量,来调用实现该接口建立出来的对象实例泛型
代码以下变量
三: 接口能够理解为是一个功能模块引用
咱们本身写的类经过实现Java提供的相应的接口,并重写接口的抽象方法,就能够获得咱们想要的功能方法
举个例子im
TreeSet是SortSet的子类,这意味着存入TreeSet的元素(对象),必需要有一个比较大小的方法,否者TreeSet没法保证元素是有序存放的
假设咱们存放的是Person类的对象。Person类有name(String),age(int),两个成员变量。咱们必须确保TreeSet有一个比较Person类的实例对象的方法
咱们用先比较名字的字母顺序,在来比较年龄的大小的方法来排序
在这里咱们能够有两种选择
实现Comparable接口,或者实现Comparator接口
先来使用Comparable接口
Person类实现Comparable接口,并重写compareTo()方法(缘由:TreeSet在添加对象时,会调用对象的compareTo()来比较对象的大小)
代码以下
注:上述代码没有实现泛型
再来使用Comparator接口来实现
代码以下
结果相同
至于为何要把Comparator的comparator做为参数传入TreeSet()构造器中,本人也是小白。我目前也不清楚
有人知道的话,能够说一下
分割线
----------------------------------
TreeSet(Comparator comparator)
构造一个空的树集合,它按照由comp指定的比较方法进行排序