之前分析Comparor接口的时候,看到方法居然有实现体,从吃惊到释然,一定是JDK8的新特性(原谅我之前一直用的1.7)。
在JDK8之前,interface中有变量和方法,其中变量是public、final、static的,方法是public、abstract的,因此在interfacer中不需要显示写出这些修饰符。
所以下面的写法是等价的。
package com.czx;
public interface BeforeJDK8Interface {
public static final int num1 = 0;
int num2 = 1;
public abstract void method1();
void method2();
}
JDK8以后,允许我们在interface中定义static和default方法(默认实现体)。
package com.czx;
public interface JDK8Interface {
public static void staticMethod(){
System.out.println("接口的静态方法");
}
public default void defaultMethod(){
System.out.println("接口的默认方法");
}
}
实现类:
package com.czx;
public class JDK8InterfaceImpl implements JDK8Interface{
//dedault方法不一定要重写,当然根据需要也可以重写
}
测试类:
package com.czx;
public class Test {
@org.junit.Test
public void test(){
//接口的静态方法必须通过接口名.方法名调用
JDK8Interface.staticMethod();
//default方法必须通过实现类的对象来调用
JDK8Interface inter = new JDK8InterfaceImpl();
inter.defaultMethod();
}
}
结果:
在实现类中对于interface的deault方法不一定要重写,当然根据需要也可以重写,此时的default修饰符要去掉
package com.czx;
public class JDK8InterfaceImpl implements JDK8Interface{
//dedault方法不一定要重写,当然根据需要也可以重写,此时的default修饰符要去掉
@Override
public void defaultMethod(){
System.out.println("实现类的重写方法");
}
}
对于同样的测试类结果变成:
由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?
1,如果多个接口中的存在同样的静态方法,此时并不会产生错误,因为jdk8只能通过接口调用接口中的静态方法,所以对编译器来说是可以区分的。
2,如果多个接口中定义了一模一样的默认方法,那么必须在实现类中重写默认方法,否则编译失败。
package com.czx;
public interface JDK8Interface2 {
public static void staticMethod(){
System.out.println("JDK8Interface2的静态方法");
}
public default void defaultMethod(){
System.out.println("JDK8Interface2的默认方法");
}
}
实现类:
package com.czx;
public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface2{
//这两个接口中存在相同的默认方法,必须重写
@Override
public void defaultMethod(){
System.out.println("实现类的重写方法");
}
}
测试类:
package com.czx;
public class Test {
@org.junit.Test
public void test(){
//接口的静态方法必须通过接口名.方法名调用
JDK8Interface.staticMethod();
JDK8Interface2.staticMethod();
//default方法必须通过实现类的对象来调用
new JDK8InterfaceImpl().defaultMethod();
}
}
结果: