JAVA8中关于接口的新特性,之后还有关于Lambda表达式的函数式接口
接口中的静态方法和默认方法
Java8接口新增默认方法与静态方法
java8之前接口中属性是静态常量,方法都是抽象方法
package Chating;
public class Jie {
public static void main(String[] args) {
}
}
interface AA{
int a = 1;//静态常量
void show();//抽象方法
//在接口中可以定义静态方法和默认方法
public static void print() {
System.out.println("接口中的静态方法");
}
public default void def() {
System.out.println("接口中的默认方法");
}
}
default默认方法
缘由:假设要给接口增加方法,如果是抽象方法,那一些已运行的项目就会编译出错(必须实现所有抽象方法)都需要改动,为了解决这个问题。就出现了默认方法,被default修饰的方法,不会被强制要求重写。能让我们更好的扩展新的类功能。
default特点
- 默认方法可以直接调用,可以不用在实现类中实现
- 一类实现多接口,而多接口中存在重名默认方法,则才必须对重名的默认方法实现
重名默认方法实现
-
可以自己去实现重名的方法
-
可以指明用哪个接口的方法
格式:接口名.super.默认方法名();
default类优先原则
实现类同时继承的父类和实现的接口中有重名的方法,这时要遵循类优先原则
即 默认是用父类中方法的实现
package Chating;
public class Jie {
public static void main(String[] args) {
Stu pp = new Stu();
pp.def();//用实现类调用方法
System.out.println("---------------");
new Stu().def();//用匿名的调用也可
}
}
interface AA{
public static void print() {
System.out.println("接口AA中的静态方法");
}
public default void def() {
System.out.println("接口AA中的默认方法");
}
}
interface BB{
public default void def() {
System.out.println("接口BB中的默认方法");
}
}
class Stu implements AA,BB{
@Override
public void def() {//可以自己为重名的方法提供实现
System.out.println("重改后的def方法");
AA.super.def();//可以指定哪个接口中的方法
}
}
package Chating;
public class Jie {
public static void main(String[] args) {
Stu stu = new Stu();
stu.def();
}
}
interface AA{
public default void def() {
System.out.println("接口AA中的默认方法");
}
}
interface BB{
public default void def() {
System.out.println("接口BB中的默认方法");
}
}
class Fu1{
public void def() {
System.out.println("父类Fu1中的def方法");
}
}
class Stu extends Fu1 implements AA,BB{
//两个接口和父类中都有重名方法,采用类优先的原则。默认调用类中的方法
}
static静态方法
缘由:一个类实现多接口,而多个接口中有重名的静态方法就很难区分,因此接口中的静态方法不会继承给实现类,可以直接调用。
格式:接口名.静态方法名() 调用静态方法
package Chating;
public class Jie {
public static void main(String[] args) {
//通过接口名.静态方法名() 调用静态方法
BB.def();
AA.def();
CC.def();
}
}
interface AA{
public static void def() {
System.out.println("接口AA中的静态方法");
}
}
interface BB{
public static void def() {
System.out.println("接口BB中的静态方法");
}
}
interface CC{
public static void def() {
System.out.println("接口CC中的静态方法");
}
}
class Stu implements AA,BB,CC{
//多个接口中有重名的静态方法
}