JDK8新特性:接口中的方法允许默认实现
在Java8中,允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。且该接口的实现类默认实现该方法。例如:
public interface Test {
default int sum(int i,int k) {
int c = i + k;
return c;
}
}
public class TestA implements Test{
// 此处无需实现sum()方法,可以直接使用接口中的方法
}
// 调用实现类TestA里的默认实现方法sum()
public class TestB extends TestA {
public int sum(int i, int k) {
TestA test = new TestA();
int result = test.sum(i,k);
return result;
}
}
接口中的默认方法和继承的父类方法冲突了,那么这个时候会选择父类中的方法,而不是接口中的默认方法。这个也叫做类优先原则,它可以保证与Java7的兼容性。也就是说,在接口中实现的一个默认方法,它不会对Java8之前写的代码产生影响。如下:
// TestA继承了DoTest类并且实现了Test接口
public class TestA extends DoTest implements Test{
// 此时DoTest类里的sum和接口里的sum方法冲突
// 必须在TestA中重写DoTest的sum()方法,否则会编译报错
@Override
public int sum(int i, int k){
return 1;
}
}
public class DoTest {
// 该方法和Test中默认实现的sum()方法冲突
public int sum(int i, int k){
return 0;
}
}
最后,使用default在接口中声明方法时可能会编译出错,需要将idea的project language level更改为1.8,并在maven配置文件中加上如下配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>