什么是接口:是为了规范行为,提供约束,从而规定的一系列行为
接口:默认是抽象的
接口:不能实例化
接口:没有private
接口:可以有多个抽象方法(抽象方法没有body),也可以有多个default / static 方法
接口: default 方法可以不被子类重写,其他方法(public /abstract)必须在实现类中重写
接口只能继承接口,不能实现接口 (interface extends interface)
abstract 声明的类不能实例化
instance of 在继承 / 实现中都可以用来判断是否是实例
@FunctionalInterface注解来显式指定一个接口是函数式接口
函数式接口:只能有一个抽象方法
举例:
public interface StringFunc {
String getString();
}
StringFunc lambda = () -> "Hello"; //() -> "Hello" 相当于,实现了StringFunc接口
final String expect = "Hello";
assertEquals(expect, lambda.getString());
单继承,一个类只能继承一个父类,有 public / private
多接口,一个类可以实现多个接口(当实现了多个接口时,可以显示通过 父类.super.method()来指定调用哪个父类的方法,而且必须重写方法,哪怕是default方法)
接口默认是public, 类里面默认是package-private
:: Method Reference
Lamda:是一个函数式接口
Lambda:允许把函数作为一个方法的参数
Lambda:只能引用标记了 final 的外层局部变量,不能在 lambda 内部修改定义在域外的局部变量,会有编译错误。
Lambda:在编译时,表达式里面的变量直接定义在闭包(closure)里面,函数执行完不会销毁,闭包保存了变量定义时的环境
Runnable :run = ()->{}
Consumer:void accept(T t) = (a) ->{}
BiConsumer:void accept(T t, U u) = (a,b) ->{}
IntConsumer:void accept(int value)
Predicate:boolean test(T t)
BiPredicate:boolean test(T t, U u)
IntPredicate:boolean test(int value)
Supplier:T get() = () ->{return a }
IntSupplier: int getAsInt() = () ->{return int }
Function: R apply(T t) = (T) ->{return R }
BiFunction:R apply(T t, U u)
IntFunction:R apply(int value)