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

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


Java8新特性-003-Java8接口中的默认方法与静态方法_第1张图片
微信公众号:JavaWeb架构师

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

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

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

接口中的静态方法

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


Java8新特性-003-Java8接口中的默认方法与静态方法_第3张图片
微信公众号: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
  • 欢迎加入交流群:451826376

  • 更多信息:www.itcourse.top

完整教程PDF版本下载

你可能感兴趣的:(Java8新特性-003-Java8接口中的默认方法与静态方法)