hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

Java8系列 (四) 静态要领和默许要领

2019-11-18杂谈搜奇网37°c
A+ A-

静态要领和默许要领

我们能够在 Comparator 接口的源码中, 看到大批相似下面如许的要领声明

    //default关键字润饰的默许要领
    default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) {
        return thenComparing(comparingInt(keyExtractor));
    }
    //Comparator接口中的静态要领
    public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() {
        return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE;
    }

个中 thenComparingInt() 就是一个默许要领, 它运用 default 关键字润饰。这是Java8引入的新功能: 接口中能够声明默许要领和静态要领。

默许要领带来的多继续题目

在此之前, Java中的类只支撑多重继续, 不支撑多继续。如今有了默许要领, 你能够以另一种体式格局来完成类的多继续行动, 即一个类完成多个接口, 而这几个接口都有声明本身的默许要领。

这内里引发了一个多继续的题目, 想象一下, 假如一个类从多个接口中继续了它们声明的默许要领, 而这几个默许要领运用的都是雷同的函数署名, 那末顺序运行时, 类会挑选挪用哪个要领呢?

代码清单一:

    @Test
    public void test2() {
        new C().hello();//result: hello from D
    }

    interface A {
        default void hello() {
            System.out.println("heelo from A");
        }
    }

    interface B extends A {
        default void hello() {
            System.out.println("heelo from B");
        }
    }

    class D implements A{
        public void hello() {
            System.out.println("hello from D");
        }
    }

    class C extends D implements A, B{
    }

代码清单一的输出结果是 hello from D,  能够看到, C类的父类D、父接口A、父接口B都定义了一个雷同函数署名的  hello() , 末了现实挪用的是父类D中声明的要领。

代码清单二:

    @Test
    public void test4() {
        new I().hello();//result: heelo from G
    }

    class I implements G, H { }
    
    interface G extends E {
        default void hello() {
            System.out.println("heelo from G");
        }
    }
    
    interface H extends E { }

    interface E {
        default void hello() {
            System.out.println("heelo from E");
        }
    }

代码清单二的输出结果是 hello from G,  能够看到, I类的父接口G、父接口E都定义了一个雷同函数署名的 hello() ,  末了现实挪用的是父接口G中声明的要领。

代码清单三:

    @Test
    public void test3() {
        new F().hello(); //result: heelo from E
    }

    interface A {
        default void hello() {
            System.out.println("heelo from A");
        }
    }

    interface E {
        default void hello() {
            System.out.println("heelo from E");
        }
    }

    class F implements A, E {
        public void hello() {
            //这里接口A和E不再具有继续关联,需显式的挑选挪用接口E或A中的要领,不然没法经由过程编译
            E.super.hello();
        }
    }

代码清单三中, 类F必需显式的掩盖父接口的 hello() 要领, 不然没法经由过程编译器的检测, 由于编译器没法肯定父接口A和父接口E中的默许要领哪个优先。

这类情况下, 假如你想挪用某个父接口的默许要领, 能够运用  接口名.super.默许要领名 这类体式格局举行挪用。

总结

Java8的新特征: 接口中能够声明默许要领和静态要领。

别的, 接口默许要领带来的多继续题目, 即假如一个类运用雷同的函数署名从多个处所(比方另一个类或接口)继续了要领, 经由过程三条划定规矩能够举行推断:

  • 类中的要领优先级最高。类或父类中声明的要领的优先级高于任何声明为默许要领的优先级。
  • 假如没法根据第一条举行推断,那末子接口的优先级更高:函数署名雷同时,优先挑选有最详细完成的默许要领的接口,即假如B继续了A,那末B就比A越发详细。
  • 末了, 假如照样没法推断, 继续了多个接口的类必需经由过程显式掩盖和挪用希冀的要领, 显式地挑选运用哪个默许要领的完成(挪用语法:  接口名.super.默许要领名 )。

作者:张小凡
出处:https://www.cnblogs.com/qingshanli/
本文版权归作者和博客园共有,迎接转载,但未经作者赞同必需保存此段声明,且在文章页面显著位置给出原文衔接,不然保存追查法律责任的权益。假如以为另有协助的话,能够点一下右下角的【引荐】。

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
Java8系列 (四) 静态要领和默许要领

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282071.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>