java8后允许在接口中定义默认方法和静态方法,具体实现见下文。

1、接口中默认方法创建和使用

默认方法使用 default 修饰符在方法前进行修饰。

package com.my.inter;

public interface MyInterface {
    //这是接口中的默认方法
    default String getString(){
        return "I'm interface inner function";
    }
}

我们创建一个实现该接口的类:

package com.my.inter;

public class ImpClass implements MyInterface{
}

使用Junit Test来做测试:

package com.my.inter;

public class Test {

    @org.junit.Test
    public void test(){
        ImpClass cls = new ImpClass();
        System.out.println(cls.getString());
    }
}

运行测试,获得如下结果:

java interface 设置空值 java interface 默认方法_java interface 设置空值


可以看出实现了MyInterface的ImpClass的实例能够正常调用接口中的默认方法。

2、类优先原则

当实现接口类与接口中的默认方法一致时,将采用“类优先”原则,选择类中的方法,而不会使用接口中定义的默认方法。
接口文件与上节一致:

package com.my.inter;

public interface MyInterface {
    //这是接口中的默认方法
    default String getString(){
        return "I'm interface inner function";
    }
}

我们创建一个实现该接口的类,且类中的方法与接口方法名及结构一致:

package com.my.inter;

public class ImpClass implements MyInterface{
    //这是实现类中的默认方法
    public String getString() {
        return "I'm class inner function";
    }
}

使用Junit Test来做测试:

package com.my.inter;

public class Test {

    @org.junit.Test
    public void test(){
        ImpClass cls = new ImpClass();
        System.out.println(cls.getString());
    }
}

运行测试,获得如下结果:

java interface 设置空值 java interface 默认方法_父类_02

3、子类同时继承父类和接口同名方法

接口文件内容不变:

package com.my.inter;

public interface MyInterface {
    //这是接口中的默认方法
    default String getString(){
        return "I'm interface inner function";
    }
}

父类存在于接口同名的方法:

package com.my.inter;

public class MyClass {
    public String getString() {
        return "I'm MyClass inner function";
    }
}

子类同时继承父类和接口:

package com.my.inter;

public class ImpClass  extends MyClass implements MyInterface{

}

使用Junit Test来做测试:

package com.my.inter;

public class Test {

    @org.junit.Test
    public void test(){
        ImpClass cls = new ImpClass();
        System.out.println(cls.getString());
    }
}

运行测试,获得如下结果:

java interface 设置空值 java interface 默认方法_Test_03


当子类同时继承接口和父类的同名方法时,默认会调用父类中的同名方法,依然保持“类”优先的原则。

4、子类同时继承父类和接口同名方法,且子类也拥有同名方法

接口文件内容不变:

package com.my.inter;

public interface MyInterface {
    //这是接口中的默认方法
    default String getString(){
        return "I'm interface inner function";
    }
}

父类存在于接口同名的方法:

package com.my.inter;

public class MyClass {
    public String getString() {
        return "I'm MyClass inner function";
    }
}

子类同时继承父类和接口,并自身存在于父类和接口同名的方法:

package com.my.inter;

public class ImpClass  extends MyClass implements MyInterface{
    public String getString() {
        return "I'm ImpClass inner function";
    }
}

使用Junit Test来做测试:

package com.my.inter;

public class Test {

    @org.junit.Test
    public void test(){
        ImpClass cls = new ImpClass();
        System.out.println(cls.getString());
    }
}

运行测试,获得如下结果:

java interface 设置空值 java interface 默认方法_Test_04


当子类同时继承接口和父类的同名方法,且子类也拥有同名方法时,默认会调用子类本身的方法,以接近原则进行调用。

5、实现多个拥有同名方法的接口

接口1:

package com.my.inter;

public interface MyInterface1 {
    //这是接口1中的默认方法
    default String getString(){
        return "I'm interface1 inner function";
    }
}

接口2:

package com.my.inter;

public interface MyInterface2 {
    //这是接口2中的默认方法
    default String getString(){
        return "I'm interface2 inner function";
    }
}

类同时实现接口1和接口2情况,方法必须重写,在重写时需要指明具体实现哪个接口的方法,写法如下:

package com.my.inter;

public class ImpClass  implements MyInterface1 ,MyInterface2{

    @Override
    public String getString() {
        return MyInterface2.super.getString();
    }
}

以上使用**MyInterface2.super.getString()**来说明使用具体接口的方法。

6、接口中静态方法创建和使用

在接口中定义静态方法和在类中定义静态方法的方式一致,使用关键字static进行方法修饰。
接口文件如下:

package com.my.inter;

public interface MyInterface {
    //这是接口中的静态方法
    public static void print(){
        System.out.println("I'm interface static function");
    }
}

在使用时直接使用“接口名.静态方法名”的方式直接调用:

package com.my.inter;

public class Test {

    @org.junit.Test
    public void test(){
        MyInterface.print();
    }
}

运行测试,获得如下结果:

java interface 设置空值 java interface 默认方法_父类_05