1 Java8中接口的新特性是什么
Java8之前,接口及其成员有以下规定:
- 接口本身及其成员都是
public
的; 接口中只能存在以下2种成员:
- 全局常量,即
static final
修饰的属性; - 抽象方法,即
abstract
修饰的方法。
- 全局常量,即
Java8中接口的新特性为,在之前的接口及其成员的规定基础上,新增了2种成员可以定义在接口中:
- 静态方法,即由
static
修饰的方法。基于之前的规定,也一定是public
的权限。
需要注意的是,接口中的静态方法能且只能通过接口名.
的方式使用,意味着对应的实现类是不具备接口的静态方法的,这与类的继承是不同的。 - 默认方法。接口中的默认方法不是指权限为默认权限的方法,而是指接口中有方法体的非
static
方法,即非抽象方法、非static
方法的普通方法。
接口中定义默认方法必须使用关键字default
,该关键字不代表权限,仅代表该方法是接口中的默认方法。基于之前的规定,也一定是public
的权限。
因此接口中定义默认方法的格式为:public default returnType method(args){}
。
接口的实现类会具备对应接口的默认方法。
2 由接口的新特性引发的注意点说明
1)实现类不会具备接口中的静态方法。接口中的静态方法能且只能通过接口名.
的方法使用。
2) 由于接口中可以存在默认方法,且对应实现类会具备对应的默认方法,因此需要对以下几种可能出现的特殊情况特别说明:
- 实现类可以重写对应接口的默认方法。
default
关键字只能用在接口中定义默认方法,在实现类重写接口的默认方法时不使用default
关键字。 一个类中存在来自接口和父类的同名同参普通方法,此时使用该类的该方法遵循的原则是:
类优先
原则,即对于存在的多个同名同参数的方法:- 如果自己有,优先用自己的;
- 如果自己没有,优先用继承的父类的;
- 最后才考虑接口中的。
- 一个类中存在来自不同接口的同名同参数普通方法,此时要作为这些不同接口的实现类,在声明时就会报错。
因为,一个类中不能存在多个同名同参的普通方法,此时要么放弃作为这种实现类,要么重写该方法,使得使用时不会出现歧义。
重写必须是能够达到同时重写这些同名同参数的普通方法的效果,如果这些同名同参数的普通方法具有不同的返回值,此时重写就无法解决上述问题。
上述体现出的问题称为“接口冲突”。 对于一个类,如果自己的普通方法与父类的和自己实现的接口的普通方法都是同名同参的,也可以理解为重写了来自父类和接口的同名同参普通方法,此时默认使用自己的方法:
- 如果想使用父类的该方法,用
super
关键字; - 如果想使用接口的该方法,用
接口名.super.
的方式。
- 如果想使用父类的该方法,用
也就是说,访问接口普通方法的方式为接口名.super.
。