Java 中的 Default 关键字-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

default 关键字是在 Java 8 中引入的新概念也可称为 Virtual extension methods——虚拟扩展方法与public、private等都属于修饰符关键字与其它两个关键字不同之处在于default关键字大部分都用于修饰接口。

default 修饰方法时只能在接口类中使用在接口中被 default 标记的方法可以直接写方法体而无需修改所有实现了此接口的类。

接口默认方法

我们都知道 Java 中的接口是用来实现的接口中是没有实现的方法。

使用 default 关键字可以打破这个限制当定义了一个接口但是我们接口中的方法用了 default 关键字我们就可以在这个方法中进行实现了。

这时我们不需要再定义一个实现类类实现接口中的所有方法。

之前的接口是个双刃剑好处是面向抽象而不是面向具体编程缺陷是当需要修改接口时候需要修改该接口的全部实现类。

同时因为设计实现的问题我们通过设计接口来进行不同的实现在基础框架曾经这个设计是有很多好处的。

但在实际业务层一个接口多个实现的方法反而谁增加很多复杂度。

使用 Default 关键字

用 default 关键字定义的方法是全局的你可以在不同接口中定义一个相同的方法这个没有问题。

如下图我们在代码中定义了 2 个接口这 2 个接口都有一个相同的 default 方法。

2023-10-20_16-23-41

实现类中只实现一个接口

如果在实现类中我们只实现一个接口。

例如下图我们修改了我们的方法我们在实现中只实现了 TestInterface1

2023-10-20_16-25-15

上面的程序也是可以运行的没有问题。

实现类中实现 2 个接口

问题就是在这里了。

如果我们在实现类中同时实现了 2 个接口但这 2 个接口都有一个相同方法名的 default 方法。

2023-10-20_16-26-00

编译器会在这里报错简单来说就是默认的方法冲突程序不知道应该用哪个实现方法。

这个应该很好理解因为这 2 个接口中都有相同的方法名而且这个方面都是默认的程序运行的时候确实不知道应该是用 TestInterface1 还是 TestInterface2 的默认方法。

所以可以在这里用一个 @Override 来告诉实现类我们是用的那个实现方法。

甚至

    @Override
    public void show() {
        TestInterface1.super.show();
        TestInterface2.super.show();
    }

这样写都是没有问题的。

运行的结果为

Default TestInterface - 1 
Default TestInterface - 2

总结

Default 方法通常用在接口中用于为接口中定义的方法提供一个默认的实现。

当我们使用了 default 关键字修饰了方法后我们可以不为接口定义实现而直接使用接口中定义的默认方法来处理逻辑。

2023-10-20_16-30-13

我们测试的代码网站逻辑如上图。

下面为文本的代码供大家拷贝和在本地进行的是

interface TestInterface1 {
    // default method
    default void show() {
        System.out.println("Default TestInterface - 1 ");
    }
}

interface TestInterface2 {
    // Default method
    default void show() {
        System.out.println("Default TestInterface - 2");
    }
}


public class Main implements TestInterface1, TestInterface2 {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);


    public static void main(String[] args) {
        new Main().show();

    }

    @Override
    public void show() {
        TestInterface1.super.show();
        TestInterface2.super.show();
    }
}

因为 default 这个关键字还比较新在 JDK 8 以后才有的因此有必要在面试之前了解下在实际的项目上可能用的情况不多。

Java 中的 Default 关键字 - Java - iSharkFly

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java