在jdk1.8之前,接口中的方法默认都是abstract的,变量都是默认 public static final,也就是接口中只存在常量,但是在jdk1.8中,允许接口中包含具有具体实现的方法和静态方法
一、默认方法
Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字修饰,该方法可以在接口中自己实现,实现类中调用
public interface x1 {
public default void a(){
System.out.println("这是x1");
}
}
public class xx implements x1{
public static void main(String[] args) {
xx xx = new xx();
xx.a();
}
}
//输出“这是x1”
1、接口冲突
如果实现类实现了两个接口,而两个接口中都存在相同的default方法,则必须在实现类中重写该方法
public interface x2 {
public default void a(){
System.out.println("这是x2");
}
}
public interface x1 {
public default void a(){
System.out.println("这是x1");
}
}
public class xx implements x1,x2{
@Override
public void a() {
System.out.println("这是重写的a方法");
}
public static void main(String[] args) {
xx xx = new xx();
xx.a();
}
}
//输出 “这是重写的a方法"”
2、优先级
1、如果一个父类提供了具体的实现,那么 接口中具有相同名称和参数的默认方法会被忽略
public interface MyFun {
default void test(){
System.out.println("接口中的方法");
}
}
public class MyFunImpl implements MyFun {
@Override
public void test() {
System.out.println("实现类方法");
}
public static void main(String[] args) {
MyFun myFun=new MyFunImpl();
myFun.test();
}
//输出 :实现类方法
}
2、如果实现类在实现两个接口的同时还继承了一个拥有相同方法的父类,则不需要重写,默认继承父类
public class x3 {
public void a(){
System.out.println("这是继承a方法");
}
}
public interface x1 {
public default void a(){
System.out.println("这是x1");
}
}
public interface x2 {
public default void a(){
System.out.println("这是x2");
}
}
public class xx extends x3 implements x1,x2{
public static void main(String[] args) {
xx xx = new xx();
xx.a();
}
}
// 输出 “这是继承a方法”
结论:
默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。
注意点:默认方法不能够重写object的方法,但是可以重载,因为在使用时将无法确定方法的调用,因为类优先的原则,所有接口的实例都是Object的子类,所有接口实例都已经有对equals/hashCode/toString等方法非默认 实现。因此,一个在接口上的这些默认方法都是无效的,它也不会被编译。
优点:如果在多个实现类实现该接口时,如果在接口中增加一个方法,就要去修改其实现类,如果实现类过多,操作太过麻烦,所以在接口中新增default方法,可以在不破坏代码的前提下扩展原有库的功能。
二、静态方法
static方法也是可以在接口中自己实现的方法,拥有自己方法体,和普通类一样,可通过接口.方法调用
public interface x1 {
public static void b(){
System.out.println("静态b");
}
}
public class xx implements x1{
public static void main(String[] args) {
x1.b();
}
}
//输出“静态b”