jdk1.8对java接口的定义添加了新特性,比如可以有默认的实现方法,以及静态方法(或者称为类方法)。这里对java在jdk1.8中的相关特性,以及使用方法做个简单的总结。
接口用法以及注意事项
首先来看一个简单的例子:
public interface RenderService {
//默认为public static final
int pc_page = 0;
//默认为public abstract
void render();
//默认是public
default void cache(){
System.out.println("接口default方法:缓存页面");
}
//静态方法,默认是public
static void cdn(){
System.out.println("接口静态方法:推送cdn缓存");
}
}
可以看到,在接口中可以定义如下4种类成员:
1、常量:接口中定义的常量默认就是被publicstatic final修饰(并且只能被public static final修饰),也就是“全局静态常量”。可以直接通过类名(或者说接口名)访问。
2、普通方法:接口中定义的普通方法默认是被publicabstract修饰(并且只能被public abstract修饰),需要由实现类实现该方法。
3、default方法:接口中定义的default方法默认是被public修饰(并且只能被public修饰),由于已经提供了默认方法,实现类可以直接使用也可以重写。
4、静态方法:接口可以看做是一种特殊的类,也可以称之为类方法,默认是被public修饰(并且只能被public修饰)。
需要注意的是在接口中不能定义default static方法。
代码测试
对应接口中的常量和静态方法,可以直接通过接口名调用,无需创建实现类对象。但如果要使用普通方法和default方法就必须创建实现类对象,通过该对象进行调用。针对上面的接口,可以通过如下的main方法进行测试:
public class Main {
public static void main(String[] args) {
//使用常量
System.out.println("接口常量:"+RenderService.pc_page);
//使用静态方法
RenderService.cdn();
//也可以用Lambda表达式
//RenderService renderService = ()-> System.out.println("子类实现方法:渲染页面");
RenderService renderService = new TestRenderService();
//使用default方法
renderService.cache();
//使用实现类方法
renderService.render();
}
}
class TestRenderService implementsRenderService{
@Override
public void render() {
System.out.println("子类实现方法:渲染页面");
}
}
在测试代码中可以看到可以直接通过RenderService类名使用常量和静态方法,而接口中定义的default方法和普通方法,必须通过实现类TestRenderService的对象进行调用。
总结
Jdk1.8中接口的新特征,主要是把抽象类中的部分特征提取到接口中。在某些情况下,可以直接用接口来代替抽象类,使接口的使用更加灵活。但不能说接口就能完全替代抽象类,毕竟他们的作用不同。
接口的作用是制订一种通用规范(这也是为什么接口中的所有方法和常量都是public的)。
抽象类的作用是对普通类进行一步的公共抽象提取。
从另外一个方面讲,Jdk1.8中接口的新特征 可以保证代码的向前兼容。比如:在老接口中加入新的方法(static方法或者default方法)后,以前老的实现类无需做任何调整(如:在jdk1.8中的List接口中,新增了replaceAll和sort方法 并添加了默认实现)。