JDK8新特性:接口的静态方法和默认方法

  之前分析Comparor接口的时候,看到方法居然有实现体,从吃惊到释然,一定是JDK8的新特性(原谅我之前一直用的1.7)。

  在JDK8之前,interface中有变量和方法,其中变量是public、final、static的,方法是public、abstract的,因此在interfacer中不需要显示写出这些修饰符。

所以下面的写法是等价的。

package com.czx;

public interface BeforeJDK8Interface {
    
    public static final int num1 = 0;
    int num2 = 1;
    
    public abstract void method1();
    void method2();
}

JDK8以后,允许我们在interface中定义static和default方法(默认实现体)。

package com.czx;

public interface JDK8Interface {
    
    public static void staticMethod(){
        System.out.println("接口的静态方法");
    }
    
    public default void defaultMethod(){
        System.out.println("接口的默认方法");
    }
}

实现类:

package com.czx;

public class JDK8InterfaceImpl implements JDK8Interface{
    //dedault方法不一定要重写,当然根据需要也可以重写
}

测试类:

package com.czx;

public class Test {
    @org.junit.Test
    public void test(){
        //接口的静态方法必须通过接口名.方法名调用
        JDK8Interface.staticMethod();
        //default方法必须通过实现类的对象来调用
        JDK8Interface inter = new JDK8InterfaceImpl();
        inter.defaultMethod();
    }
}

结果:

  在实现类中对于interface的deault方法不一定要重写,当然根据需要也可以重写,此时的default修饰符要去掉

package com.czx;

public class JDK8InterfaceImpl implements JDK8Interface{
    //dedault方法不一定要重写,当然根据需要也可以重写,此时的default修饰符要去掉
    @Override
    public void defaultMethod(){
        System.out.println("实现类的重写方法");
    }
}

对于同样的测试类结果变成:

  由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?

1,如果多个接口中的存在同样的静态方法,此时并不会产生错误,因为jdk8只能通过接口调用接口中的静态方法,所以对编译器来说是可以区分的。

2,如果多个接口中定义了一模一样的默认方法,那么必须在实现类中重写默认方法,否则编译失败。

package com.czx;

public interface JDK8Interface2 {
    
    public static void staticMethod(){
        System.out.println("JDK8Interface2的静态方法");
    }
    
    public default void defaultMethod(){
        System.out.println("JDK8Interface2的默认方法");
    }
}

实现类:

package com.czx;

public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface2{
    //这两个接口中存在相同的默认方法,必须重写
    @Override
    public void defaultMethod(){
        System.out.println("实现类的重写方法");
    }
}

测试类:

package com.czx;

public class Test {
    @org.junit.Test
    public void test(){
        //接口的静态方法必须通过接口名.方法名调用
        JDK8Interface.staticMethod();
        JDK8Interface2.staticMethod();
        //default方法必须通过实现类的对象来调用
        new JDK8InterfaceImpl().defaultMethod();
    }
}

结果:

 

身体是革命的本钱,爱跑步,爱生活!
原文地址:https://www.cnblogs.com/caozx/p/8531200.html