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、常量:接口中定义的常量默认就是被public static final修饰(并且只能被public static final修饰),也就是“全局静态常量”。可以直接通过类名(或者说接口名)访问。
2、普通方法:接口中定义的普通方法默认是被public abstract修饰(并且只能被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(); RenderService renderService = new TestRenderService(); //使用default方法 renderService.cache(); //使用实现类方法 renderService.render(); } } class TestRenderService implements RenderService{ @Override public void render() { System.out.println("子类实现方法:渲染页面"); } }
在测试代码中可以看到可以直接通过RenderService类名使用常量和静态方法,而接口中定义的default方法和普通方法,必须通过实现类TestRenderService的对象进行调用。
总结
Jdk1.8中接口的新特征,主要是把抽象类中的部分特征提取到接口中。在某些情况下,可以直接用接口来代替抽象类,使接口的使用更加灵活。但不能说接口就能完全替代抽象类,毕竟他们的作用不同。
接口的作用是制订一种通用规范(这也是为什么接口中的所有方法和常量都是public的)。
抽象类的作用是对普通类进行一步的公共抽象提取。