一、接口
-
接口的引入
类想要获得某项服务,必须得遵从(实现)一个接口。
例如:类T必须实现了Comparable接口,Arrays.sort方法才能对类T的对象数组T[] 进行排序。
分析:Arrays.sort方法中会调用T的compareTo方法,显然在调用前编译器必须确保compareTo方法在T中是存在的,而当T实现了Comparable接口时一定满足这个条件。-> episode
父类和子类覆盖重写compareTo方法,有两种比较逻辑:-
只支持同类对象之间进行比较,父类和子类之间不允许比较:
采用getClass()方法判断调用者和传入的参数类型是否一致。 -
由父类统一进行比较,在父类中定义compareTo方法,并限定为final,子类不能重写:
采用instanceof关键字判断传入的类型是不是属于父类类型或其子类。
-
-
接口的特性
接口中的所有方法均自动属于public。
接口中的所有域自动属于public static final类型(编译期常量)。
接口中的所有内部类自动属于public static类型。Java SE8新特性
1).采用default关键字可以在接口中定义一个实现了的方法。
2).在接口中定义static方法。 -
default方法的二义性问题
1).若一个类A实现的两个接口B和C当中存在一个相同的default方法defaultMethod,则类A必须给出defaultMethod的实现。
2).若1中是一个接口B和一个类D,则遵从“类优先原则”,不要求A给出defaultMethod的实现。
二、lambda表达式
回调:某个特定事件发生时会调用某段操作。
-
为什么要引入lambda表达式?
实现将一个代码块传递给对象,这个代码块会在将来某个时间被调用。
Arrays.sort(words,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// compare
.....
return 0;
}
});
-
函数式接口:只有一个抽象方法method的接口。
lambda表达式用于转化为函数式接口,当做method的执行体,若method有返回值时,lambda表达式的结果自动返回,无需使用return关键字。
lambda表达式可以看做是一个函数,而不是一个对象。 -
使用方法:把lambda表达式作为方法的参数传入。
Arrays.sort(words,
(String first,String second) -> first.length() - second.length());
-
语法:
</
形参类型结合上下文可推导出时可省略,即为(first,second) -> …
只有一个形参,且形参类型确定时,可省略() ,即为event -> …
若无形参时,需要保留(),即为() -> …