在 Java 7 和之前的版本中,接口 interface 是不能包含具体的方法实现的。对于一个接口有多个实现的时候,我们通常的做法就是让所有的实现继承另一个基础类,然后在这个基础类中实现这个方法。

java 接口volatile属性 java 接口default_java 接口volatile属性

java 接口volatile属性 java 接口default_css_02

Java 8 中为接口提供了一个新的功能,允许某个接口方法有个默认实现。

1

默认方法 

Java 8 为 接口 ( interface ) 中引入了 「 默认方法 」( default method ) 实现这个新的概念。

default 关键字,用于标识这个方法是可以有具体的实现。有了 default 关键字,我们就可以在所有集合都实现的接口 Collection<E> 中添加一个 forEach 方法啦。

这是一个非常重要的新功能,它的出现,Java 8 及以后的版本,添加新功能的速度明显加快了很多。

2

默认方法语法

package com.sjh.test.java8.service;

public interface Greeter {

    default void method(){
        System.out.println(" Hello ,我是二哥!");
    }
}

从语法中可以看到,一个接口默认方法和普通的接口方法声明有两个不同点:

1、 接口默认方法可以有具体实现

2、 接口默认方法需要使用 default 关键字修饰。

3

默认方法特征 

1、 一个接口可以有任意数量的默认方法,也可以没有默认方法

2、 如果一个类实现的两个接口都有一个同名的默认方法,那么该类必须自己实现同样的方法,然后在实现内部可以调用相应接口的方法

4

代码范例 

A

接口默认方法 

package com.sjh.test.java8.service;

public class Test1 {

    public static void main(String[] args)
    {
        Greeter gt = new Greeter(){};
        gt.greeter("二哥!");
    }

    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("Hello ," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test1
Hello ,二哥!

Process finished with exit code 0

B

一个接口可以有多个默认方法  

package com.sjh.test.java8.service;

public class Test2 {
    public static void main(String[] args)
    {
        Greeter gt = new Greeter(){};
        gt.greeter("二哥!");
        gt.greeterEn("JayLa!");
    }

    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("你好," + name );
        }

        default public void greeterEn(String name)
        {
            System.out.println("Hello," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test2
你好,二哥!
Hello,JayLa!

Process finished with exit code 0

C

一个类实现了多个具有同名的默认方法接口 

如果一个类实现了两个或两个以上的接口,而这些接口有两个或两个以上实现了相同的方法名的默认方法,最简单的方法就是类自己实现一个相同的方法。

package com.sjh.test.java8.service;

public class Test3 {

    public static void main(String[] args)
    {
        Test3 tester = new Test3();
        tester.run();
    }

    public void run()
    {
        Greeter gt = new Hello();
        gt.greeter("二哥!");
    }

    class Hello implements Greeter,GreeterEn {
        public void greeter(String name)
        {
            System.out.println("1、你好," + name );
        }
    }


    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("2、你好," + name );
        }
    }

    interface GreeterEn {

        default public void greeter(String name)
        {
            System.out.println("3、Hello," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test3
1、你好,二哥!

Process finished with exit code 0

还可以调用相关接口的默认方法

package com.sjh.test.java8.service;

public class Test4 {
    public static void main(String[] args)
    {
        Test4 tester = new Test4();
        tester.run();
    }

    public void run()
    {
        Greeter gt = new Hello();
        gt.greeter("二哥!");
    }

    class Hello implements Greeter,GreeterEn {
        public void greeter(String name)
        {
            Greeter.super.greeter(name);
        }
    }


    interface Greeter {
        default public void greeter(String name)
        {
            System.out.println("1、你好," + name );
        }
    }

    interface GreeterEn {

        default public void greeter(String name)
        {
            System.out.println("2、Hello," + name );
        }
    }
}

运行结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test4
1、你好,二哥!

Process finished with exit code 0

e