接口
1、什么是接口
在java中,接口是与类同一级别的一种类型
2、接口区别于类,具有哪些特性?
- 关键字为interface
- 可以实现(implements),但不可以继承(extends)
- 一个类可以实现多个接口,但是一个类只能有一个父类
- 接口的权限修饰符仅为public和默认
java中的四个权限修饰符
1)public和默认
关注点在是是同一个包中,public表示无论是否在同一个包中,都有权限;而默认的情况仅在同一个包中有权限
2) protected和private
关注点在是否具有继承性,private表示不具有继承性,仅能自己使用;而protected具有继承性,所有的子类都可以使用(注意!!!!!同一个包中不具有继承的其它类也可以使用)
类和接口只能通过public和默认修饰,但是内部类可以用四种修饰符修饰
同包自己 | 同包非自己 | 不同包子类 | 不同包非子类 | |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
默认不写 | Y | Y | N | N |
private | Y | N | N | N |
- 没有构造函数,不可以被实例化,类具有(抽象类当然也具有,虽然抽象类不能被实例化)
- 接口中:方法+常量
- 方法:
public abstract
,无论是否显式表达,都是公共的&抽象的 - 常量:
public static final
,无论是否显式表达,都是公共的&全局的
- 方法:
- 如果一个类实现了该接口,那么必须实现该接口的全部方法,否则该类为抽象类
3、jdk8让接口有了一些新特性
- 可以有变量型属性
- 可以有静态方法
static
- 静态关键字和抽象关键字相冲突,是不能同时修饰同一个方法的
- 可以直接通过
接口名.方法()
调用 static
和default
不能同时修饰方法- 接口中的静态方法只能通过接口调用,不能通过实现接口的类的对象调用
- 可以有非抽象方法
default
修饰- 可以使用接口中属性
- 可以被实现类使用
- 可以被继承类重写
- 为什么支持默认方法重写:解决多个实现类同名方法的问题,可以通过加default,让实现类重写来解决冲突问题
- 不支持默认方法前的重名问题:!!没有default的多接口实现存在同名问题,但由于之前默认是抽象方法,所以一定会在实现类中“重写“——
如果,两个接口中的方法完全一致,则默认实现了两个接口中的方法;如果参数满足重载的特性,则它们需要分别被实现;如果除了返回值不同其他都相同,则编译会报错,该类无法同时实现这两个接口
- default方法产生的原因:如果接口A被很多类实现了,如果这个时候想要修改接口,实现接口的全部类全部都要修改,成本太大,这时如果给该方法用default关键字修饰,则这些类可以不用修改
函数式接口
1、什么是函数式接口
如果一个接口,它有且只有一个抽象方法(可以有默认方法和常量等),那么该接口就是函数式接口
- 实现函数式接口可以通过lambda表达式进行实现
- 可以标注
@FunctionalInterface
注解