专栏目录

三、Java 9 ~ 17 新特性试读

Java 9 新特性:接口支持定义 private 方法

友情提示

推荐您使用 Chrome 浏览器来阅读本实战专栏,其他浏览器可能存在兼容性问题。

本章节中,我们来学习一下 Java 9 ~ 17 版本中,那些比较有用的、实际开发中能够用到的新特性。

在 Java 8 中,接口引入了 defaultstatic 方法,使得我们可以在接口中编写相关方法。如星球中的第一个项目 中,就将 Mybatis Plus 操作数据库相关的代码,通过 default 默认方法封装在了 Mapper 接口中,如下图所示:

而从 Java 9 开始,接口开始支持定义 private 私有方法。本小节中,我们就来通过一个小示例,来学习一波这个新特性。

Java 8 中

首先,定义一个 Old 接口,代码如下:

public interface Old {

    default void d1() {
        System.out.println("Old::d1");
    }

    static void d2() {
        System.out.println("Old::d2");
    }

    default void a() {
        d1();
    }

    static void b() {
        d2();
    }

}
  • 定义一个 d1() 默认方法,并输出一行控制台日志;
  • 定义一个 d2() 静态方法,并输出一行控制台日志;
  • 定义一个 a() 默认方法,主动调用 d1() 方法;
  • 定义一个 b() 静态方法,主动调用 d2() 方法;

接着,创建它的实现类 OldImpl , 如下:

public class OldImpl implements Old {
}

场景描述:假设我们只想对外暴露 a()b()d1()d2() 都是内部定义的方法,不希望外部能够调用他们!

调用上面定义的相关方法,代码如下,会发现都是可以被调用的:

public class Main {

    public static void main(String[] args) {
        // 调用 a() 方法
        new OldImpl().a();
        // 调用 b() 方法
        Old.b();

        // 调用 d1() 方法
        new OldImpl().d1();
        // 调用 d2() 方法
        Old.d2();
    }

}

控制台输出如下:

Java 9 之后

Java 9 之后,接口支持了 private 关键字后,就可以实现上面的需求了,代码如下:

public interface New {

    private void d1() {
        System.out.println("Old::d1");
    }

    private static void d2() {
        System.out.println("Old::d2");
    }

    default void a() {
        d1();
    }

    static void b() {
        d2();
    }

}

注意:方法添加了 private 关键字后,就不用再添加 default 关键字了,默认就表示该方法是 default

再来调用相关方法,就发现被 private 修饰的方法无法被调用了,如下图所示:

最后编辑于 2024-04-26 19:59:47