美文网首页JavaWeb
Java8新特性-003-Java8接口中的默认方法与静态方法

Java8新特性-003-Java8接口中的默认方法与静态方法

作者: 53b3f4658edc | 来源:发表于2017-12-26 18:28 被阅读0次

    Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用default 关键字修饰。


    微信公众号:JavaWeb架构师

    接口默认方法的”类优先”原则

    若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时:

    • 选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
    • 接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突
    微信公众号:JavaWeb架构师

    接口中的静态方法

    Java8 中,接口中允许添加静态方法。


    微信公众号:JavaWeb架构师

    测试代码

    package java8._interface;
    
    import org.junit.Test;
    
    public class TestInterfaceDefaultStaticMethod {
        /*
         *1.默认方法:
         *  1.1.Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用default 关键字修饰。
         *  1.2.接口默认方法的”类优先”原则:
         *      1.2.1.接口默认方法与类方法冲突时(方法名、参数列表相同):优先选择类方法 。
         *      1.2.2.两个接口中的默认方法冲突时(方法名、参数列表相同),必须重写以解决。
         *2.静态方法:
         *  2.1.Java 8中允许接口中包含有静态方法。
         */
        
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
        // 1.1.认识接口中的默认方法
        @Test
        public void test1() {
            MyInter1 m = () ->System.out.println("你好,我是公有抽象方法!");
            m.method2();
            m.method1();
        }
        /*
         * 结果:
         * 我是默认方法,在定义接口的时候就实现了!
         * 你好,我是公有抽象方法!
         */
        
        /*
         * 曾经的接口:
         * 1.允许公有静态产量存在。
         * 2.允许共有抽象方法存在。
         */
        interface MyInter1 {
            // 1.共有静态常量。
            public static final int LENGTH = 10;
            
            // 2.公有抽象方法。
            public abstract void method1(); 
            
            // 3.jdk 1.8新增的默认方法:使用default关键字修饰;在定义接口时就实现;后面可以直接调用;不影响函数式接口。
            default void method2() {
                System.out.println("我是默认方法,在定义接口的时候就实现了!");
            }
        }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 2.解决类冲突:类优先
        @Test
        public void test2() {
            // 继承的类与实现的接口中的默认方法冲突时,默认使用类中方法。
            new MyClass2().method2();
        }
        /*
         * 结果:
         * 我是类中的方法!
         */
        
        class MyClass1 {
            public void method2() {
                System.out.println("我是类中的方法!");
            }
        }
        
        class MyClass2 extends MyClass1 implements MyInter1 {
    
            @Override
            public void method1() {
                System.out.println("实现接口中没有实现的方法!");
            }
        }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 3.解决接口冲突:重写方法。
        @Test
        public void test3() {
            new MyClass3().method2();
        }
        /*
         *结果:
         * 接口中默认方法冲突,通过重写解决!
         */
        
        interface MyInter2 {
            default void method2() {
                
                System.out.println("我是接口2中的默认方法!");
            }
        }
        
        class MyClass3 implements MyInter1,MyInter2 {
    
            @Override
            public void method2() {
                System.out.println("接口中默认方法冲突,通过重写解决!");
            }
    
            @Override
            public void method1() {
                
            }
            
        }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 4.接口中的静态方法
        @Test
        public void test4() {
            MyInter3.display();
        }
        /*
         * 结果:
         * 接口中的静态方法!
         */
        interface MyInter3 {
            // Java 8中可以在接口中定义静态方法
            public static void display() {
                System.out.println("接口中的静态方法!");
            }
        }
    }
    
    微信公众号:JavaWeb架构师

    其它

    • 源码下载
    关注下方公众号,回复:Java8.code
    
    完整教程PDF版本下载

    相关文章

      网友评论

        本文标题:Java8新特性-003-Java8接口中的默认方法与静态方法

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