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

本文介绍了JDK8中接口的新特性,包括在接口中定义static和default方法的能力。通过示例展示了如何实现这些方法,并讨论了当实现类继承多个接口且这些接口包含相同default方法时的处理方式。

  之前分析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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值