JDK8新特性2->接口的组成与使用

本文详细介绍了JDK8中接口的更新,包括新增的默认方法和静态方法,以及函数式接口的概念。探讨了使用时的注意事项,如访问修饰符、调用方式和菱形继承问题的解决策略。

前言:

JDK8中新增了一系列的特性,接口的组成也进行了一系列的变革,当然是在原有的基础上新增了静态方法和default方法,

一、接口组成  

更新之前的组成:①静态常量  ②抽象方法

修饰词 interface 接口名{
    静态常量;
    抽象方法;
}

更新之后的接口组成①静态常量   ②抽象方法   ③默认方法    ④静态方法

修饰词 interface 接口名{
    静态常量;
    抽象方法;
    默认方法;
    静态方法;
}

 

package lambdasinaction.chap9;

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

再定义一个类实现接口

public class MyClass implements MyInterface {
//实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写
}

二、使用时注意事项

1、不论时静态方法还是默认方法默认都是Public),静态可以使用别的访问修饰符,但默认方法只能public修饰

2、静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。

public class Main {
    public static void main(String[] args) {
        // static方法必须通过接口类调用
        MyInterface.staticMethod();

        //default方法必须通过实现类的对象调用
        new MyClass().defaultMethod();
    }
}

    3、当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。

public class MyClass implements MyInterface {
    
    // 签名跟接口default方法一致,但是不能再加default修饰符
    @Override
    public void defaultMethod() {
        System.out.println("接口实现类覆盖了接口中的default");
    }
}

4、菱形继承问题 ,实现多个接口而有同名的默认方法产生的问题

由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口并且父类中并没有同名方法,则可能会编译失败,因为编译器无法判断

解决 冲突的机制其实相当简单。你只需要遵守下面这三条准则就能解决所有可能的冲突。

1、 首先,类或父类中显式声明的方法,其优先级高于所有的默认方法。

2、如果用第一条无法判断,方法签名又没有区别,那么选择提供最具体实现的默认方法的 接口。

3、 最后,如果冲突依旧无法解决,你就只能在你的类中覆盖该默认方法,显式地指定在你 的类中使用哪一个接口中的方法。

PS:因为static方法必须显式调用所以并不会产生问题,建议显式指定你在类中使用哪一个接口中的方法

三、函数式接口

接口中只有一个抽象方法就被称为函数式接口,函数式接口也可以显式的使用@FunctionalInterface 标记,

函数式接口主要使用在lambda表示式中,关于lambda表达式具体可以参考Lambda表达式详解

 

四、对于新引入特性的思考

为什么引入新特性呢?我想是源于解决API的不断演进出现的问题

附上JAVA8实战中的一段话

静态方法及接口 同时定义接口以及工具辅助类(companion class)是Java语言常用的一种模式,工具类定 义了与接口实例协作的很多静态方法。比如,Collections就是处理Collection对象的辅 助类。由于静态方法可以存在于接口内部,你代码中的这些辅助类就没有了存在的必要,你可 以把这些静态方法转移到接口内部。为了保持后向的兼容性,这些类依然会存在于Java应用程 序的接口之中。

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值