公有静态常量
。 而方法默认是public abstract,公有抽象方法
,但是事实真的是这样吗?
一.新特性
Java 1.8对接口有两个方面的增强:接口中可以添加使用default或者static修饰的方法
增加default方法
:又叫做接口扩展方法
,即在不破坏java现有实现架构的情况下能往接口里增加新方法, default关键字可以给接口添加一个非抽象的方法实现,子类可以直接调用!
如果想对接口增加一个新方法,那么需要对实现该接口的所有类进行修改,如果接口实的现类很多,就会带来很大的工作量,而且还很容易破坏以前的代码,带来一些问题。如果把新的方法定义为default方法,就可以避免对其他实现类的修改。尽管如此,Default 方法不适合过多使用
增加static方法
: 接口中用static修饰的方法也可以有方法体,和类的静态方法一样,可以通过 接口名.方法名 进行接口中 static方法的调用。
如果接口A中有default方法:
public interface A {
public default void a(){
System.out.println("这是AAA");
}
}
B类实现接口A:
public class B implements A{
}
那么B类将会继承接口A中的a方法:
public class Main {
public static void main(String[] args) {
B b = new B();
b.a();
}
}
执行结果:
为什么要重写呢?是因为,类在继承接口中的default方法时,不知道应该继承哪一个接口中的default方法。
接口A:
public interface A {
public default void a(){
System.out.println("这是A");
}
}
接口B:
public interface B {
public default void a(){
System.out.println("这是B");
}
}
Test类:
com.demo.test.Test inherits unrelated defaults for a() from types com.demo.test.A and com.demo.test.B
可以看出,接口的实现类可以直接调用接口中用default修饰的方法,并且不需要实现该方法(也可以实现)
接口A:
public interface A {
public default void a(){
System.out.println("AAA");
}
}
类B:
public class B {
public void a(){
System.out.println("BBB");
}
}
子类C:
public class C extends B implements A{
public static void main(String[] args) {
C c = new C();
c.a();
}
}
执行结果:
说明子类继承的b方法为父类C中的b方法,不是接口中的default b(){}方法。
static关键字常用于修饰类的属性和方法,同样,在Java8,static也可以修饰接口的方法
接口A:
public interface A {
public static void a(){
System.out.println("AAA");
}
}
调用接口A的静态方法:
public class B {
public static void main(String[] args) {
A.a();
}
}
执行结果:
可以看出,在接口中用static修饰的方法,可以直接用接口名.方法名(这里A.a())调用,并且实现类不能实现接口中static修饰的方法。