接口技术作用:主要描述类具有什么功能,而并不给出每个功能的是的实现。
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 表达式、函数式接口、方法引用、内部类、代理暂略。【后续单独补上】