前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 8 新特性|接口默认方法

Java 8 新特性|接口默认方法

作者头像
Java小技巧
发布2022-05-23 12:52:04
6140
发布2022-05-23 12:52:04
举报
文章被收录于专栏:Java小技巧

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

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

1

默认方法

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

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

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

2

默认方法语法

代码语言:javascript
复制
package com.sjh.test.java8.service;

public interface Greeter {

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

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

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

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

3

默认方法特征

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

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

4

代码范例

A

接口默认方法

代码语言:javascript
复制
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 );
        }
    }
}

运行结果:

代码语言:javascript
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test1
Hello ,二哥!

Process finished with exit code 0

B

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

代码语言:javascript
复制
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 );
        }
    }
}

运行结果:

代码语言:javascript
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test2
你好,二哥!
Hello,JayLa!

Process finished with exit code 0

C

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

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

代码语言:javascript
复制
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 );
        }
    }
}

运行结果:

代码语言:javascript
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test3
1、你好,二哥!

Process finished with exit code 0

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

代码语言:javascript
复制
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 );
        }
    }
}

运行结果:

代码语言:javascript
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.service.Test4
1、你好,二哥!

Process finished with exit code 0

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小技巧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档