美文网首页
java8接口新特性:default、static

java8接口新特性:default、static

作者: 帅气滴糟老头 | 来源:发表于2018-09-05 23:29 被阅读0次

    之前面试时被过关于java8中接口的新特性问题,当时没有回答好,后查找资料,在这里做下笔记。


    java8之前接口中的方法默认类型都是public abstract,也就是抽象方法,具体实现都交给实现类。而java8对接口功能做了增强,增加了default方法和static方法,也就是说从java8开始接口中的方法不再只能是抽象的,也可以有实现。
    其应用也非常简单,如下面的例子所示,在接口中定义default和static方法:

    public interface DefaultInterface {
        // default方法
        default void defaultFunction(){
            System.out.println("this is a default function");
        }
        // static方法
        static void staticFunction(){
            System.out.println("this is a static funcion");
        }
    }
    

    在实现类中可以直接调用接口的default方法,通过接口名.方法名调用static方法:

    public class DefaultInterfaceImpl implements DefaultInterface{
        public static void main(String[] args){
            // 调用default方法
            new DefaultInterfaceImpl().defaultFunction();
            // 调用static方法
            DefaultInterface.staticFunction();
        }
    }
    

    运行结果如下:


    注意点:
    1. 实现类可以重写default方法,不能重写static方法
    2. 如果一个类实现了两个接口,而这两个接口拥有相同方法签名(相同的方法名、参数)、返回类型的default方法时,实现类就必须重写该default方法,否则编译器会因为不知道应该调用哪一个接口中的default方法而报错。重写接口中default方法后,编译器会执行重写后的方法。不过好的编程习惯是明智的选择方法名,避免和其它接口产生冲突。
    3. 如果一个类同时继承了一个类和实现了一个或多个接口,而父类中拥有和接口中default方法相同的签名、返回值的方法时,当该类未重写该方法,直接调用时,将会调用父类中的方法。

    新特性带来的好处:

    1. 增加default方法,可以在不破坏java现有实现架构的情况下能往接口里增加新方法。
      尽管如此,还是不推荐过度使用,如果你大量使用default方法在你的应用接口中,你将很快意识到他没有真正精简代码。因为你不能在接口中提炼default里重复的代码到一个新的普通方法,这与以精简代码为目的的default关键字相冲突。不过这个问题在java9中通过在接口中支持private interface methods得到解决。不过一般公司项目在jdk版本的使用上并不会太激进。
      具体参考链接:https://www.cnblogs.com/wanshiming/p/9011879.html
    2. 而static方法除了调用比较方便外还有一个有趣的意义,程序入口main方法也是static,现在在接口也可以运行了。

    接口和抽象类:
    如此看来接口是不是和类越来越接近了?那么回归到一道基础的面试题:现在接口和抽象类有什么区别呢?

    1. 一个类只能继承一个抽象类,却可以实现多个接口。
    2. 虽然接口和抽象类都不能被实例化,但是抽象类可以有构造器,接口没有构造器。
    3. 抽象类中方法可以有public、protected、默认(包)甚至private范围的方法,接口只能有public范围的方法(即使是default也是public范围的,当然从java9开始接口也可以有private方法 。

    参考:
    https://blog.csdn.net/zyq_2014/article/details/80964715

    相关文章

      网友评论

          本文标题:java8接口新特性:default、static

          本文链接:https://www.haomeiwen.com/subject/rnuzwftx.html