接口技术作用:主要描述类具有什么功能,而并不给出每个功能的是的实现。

Java的继承(inheritance)是不支持的多继承的,但是Java接口是支持多继承的。

一个 Java 类实现一个接口类就必须实现接口类中的每一个方法。

接口中的所有方法自动地属于 public 。

在接口中还可以定义常量,但是不能有实例域。

在JDK1.8之前,也不能在接口中实现方法。1.8+版本可以实现一些简单的方法(静态方法、默认方法),不过这些方法不能引用实例域---(接口没有实例域)

提供实例域和方法的任务应该由实现接口的那个类来完成。

接口中的静态方法:

在 Java SE 8 中, 允许在接口中增加静态方法 。理论上讲 , 没有任何理由认为这是不合法的 。 只是这有违于将接口作为抽象规范的初衷 。
通常的做法都是将静态方法放在伴随类中 。 在标准库中 , 你会看到成对出现的接口 和实用工具类 , 如 Collection/ Collections 或 Path/ Paths 。

public interface Path
{
    public static Path get ( St ring first , String... more ) {
        return Fi 1 eSystems . getDefaul t () . get Path( fi rst , more ) ;
    }
}

接口中的默认方法:

可以为接口方法提供一个默认实现 。 必须用 default 修饰符标记这样一个方法 。
 

public interface Comparable<T>
{
    default int compareTo ( T other ) { return 0; }
    // By default , all elements are the same
}

解决接口默认方法的冲突

如果先在一个接口中将一个方法定义为默认方法 然后又在超类或另一个接口中定义了,同样的方法, 会发生什么情况 ?

Java 的相应规则要简单得多 。 规则如下 :
1 ) 超类优先 。

如果超类提供了一个具体方法 , 同名而且有相同参数类型的默认方法会被忽略 。
2 ) 接口冲突 。

如果一个超接口提供了一个默认方法 另一个接口提供了一个同名而且,参数类型 ( 不论是否是默认参数 ) 相同的方法, 必须覆盖这个方法来解决冲突 。
 

6.2.2 Comparator 接口

比较器接口,用于增加自定义的比较规则。

现在假设我们希望按长度递增的顺序对字符串进行排序, 而不是按字典顺序进行排序 。肯定不能让 String 类用两种不同的方式实现 compareTo 方法,更何况, String 类也不应由我们来修改 。

要处理这种情况 , ArrayS .Sort 方法还有第二个版本, 有一个数组和一个比较器 ( comparator )作为参数, 比较器是实现了 Comparator 接口的类的实例 。

public interface Comparator<T>
{
    int compare(T first, T second ) ;
}

要按长度比较字符串, 可以如下定义一个实现 Comparator<String > 的类 :

class LengthComparator implements Comparator<String>
{
    public int compare(String first, String second ) {
        return first.lengthO - lengthO ;
    }
}

具体完成比较时,需要建立一个实例:

Comparator<String> comp = new LengthComparator();
if(comp.compare(words[i], words[j]) > 0);


// 使用 Arrays.sort方法
String [] friends = { "Peter " , " Paul ", "Mary" } ;
Arrays,sort (friends, new LengthComparatorO ) :

lambda 表达式、函数式接口、方法引用、内部类、代理暂略。【后续单独补上】