大家都知道接口是用来对代码进行一种规范,对代码进行一种规范,实际开发中大多是协作开发,所以这就需要一种规范,大家都按照这种规范对代码进行书写,那么就会在整合的时候,非常的轻松了。
然而,有些时候会出现一个问题就是:当有多个类实现了相同的接口,接口中的某一些方法的实现体可能都是一样的时候,这样无疑浪费了很多时间,在写重复的代码,或者说copy。
应对于这种情况,Java8在接口中为我们新增了default和static方法,这两种方法可以有方法体。
/*定义一个接口*/
public interface Compute {
int sub(int x,int y);
default void ComputeDefault(){
System.out.println("Compute的default方法。");
}
static void ComputeStatic(){
System.out.println("Compute的static方法。");
}
}
/*实现类*/
public class ComputeImpl implements Compute {
@Override
public int sub(int x, int y) {
return 0;
}
@Override
public void ComputeDefault() {
}
}
/*定义一个SubTest接口去继承接口Compute*/
public interface SubTest extends Compute {
}
/*SubTest接口的实现类*/
public class SubTestImpl implements SubTest {
@Override
public int sub(int x, int y) {
return 0;
}
@Override
public void ComputeDefault() {
}
}
/*SubTest接口的测试类*/
public class Main1 {
public static void main(String[] args) {
SubTest subTest = new SubTestImpl();
subTest.ComputeDefault();
subTest.sub(2,3);
}
}
可以发现接口中的默认方法,即default方法可以被继承或者实现,而静态方法,即static修饰的有方法体的方法不会被继承或实现。下面是实现的几个常用方法:
/*Compute接口的测试类*/
public class Main {
public static void main(String[] args) {
Compute compute = new ComputeImpl();
System.out.println(compute.sub(2,1));
compute.ComputeDefault();
}
}
示例如下:我们会发现static方法能够被它自身所调用。
/*Computer接口的测试类*/
public class Main {
public static void main(String[] args) {
Compute compute = new ComputeImpl();
System.out.println(compute.add(2, 1));
System.out.println(compute.sub(2, 1));
Compute.minus(1,2);
}
}
结论1:接口中的static不能被继承,也不能被实现类调用,只能被自身调用。
现在我么在子接口中重写default方法,再进行调用:
/*重写default方法*/
public class Main1 {
public static void main(String[] args) {
SubTest subTest = new SubTestImpl();
subTest.ComputeDefault();
subTest.sub(2,3);
}
}
/*执行结果*/
D:\jdk1.8\bin\java "
subTest default方法。
Process finished with exit code 0
结论2:default方法被继承时,可以被子接口重写。