首页 > 编程语言 >Java 中的 Default 关键字

Java 中的 Default 关键字

时间:2023-10-22 09:22:37浏览次数:36  
标签:default Java show Default 接口 关键字 方法 实现

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 以后才有的,因此有必要在面试之前了解下,在实际的项目上,可能用的情况不多。

https://www.isharkfly.com/t/java-default/15061

标签:default,Java,show,Default,接口,关键字,方法,实现
From: https://www.cnblogs.com/huyuchengus/p/17779903.html

相关文章

  • Java应用中的一些系统变量说明
    //获取所有的系统属性Propertiesproperties=System.getProperties();for(Strings:properties.stringPropertyNames()){//输出对应的key和valueSystem.out.println(s+"="+properties.getProperty(s));}java.io.tmpdir在开发过程中,我们经常需要使用临时......
  • java学习_04
    自增自减运算符++和--无论是放在变量的前边还是后边,单独写一行结果是一样的publicclassday4_02{publicstaticvoidmain(String[]args){intx=10;//后++:先用后加//先把x变量中的值拿出来用,赋值给y,然后再进行自增。//......
  • Javaweb(十二)
    1、Ajax:异步的JavaScript和XML1.1、Ajax的作用:①、与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据使用了AJAX和服务器进行通信,就可以使用HTML+AJAX来替换JSP页面了②、异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页......
  • 在JavaScript中,如何检查空字符串、未定义或空值?
    内容来自DOChttps://q.houxu6.top/?s=在JavaScript中,如何检查空字符串、未定义或空值?JavaScript中是否有string.Empty,还是需要单独检查""?空字符串、未定义、空值等要检查一个真值:if(strValue){//strValue是一个非空字符串,true,42,Infinity,[],等等}要检查一个假......
  • 如何测试一个空的JavaScript对象?
    内容来自DOChttps://q.houxu6.top/?s=如何测试一个空的JavaScript对象?在AJAX请求之后,有时我的应用程序可能会返回一个空对象,例如:vara={};我如何检查是否确实如此?你可以使用带有Object.hasOwn(ECMA2022+)测试的for…in循环来检查一个对象是否有任何自己的属性:functio......
  • Java拾贝第八天——线程的状态和常用方法
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么任何线程一般具有5种状态。(非生命周期)创建状态:新建了一个线程对象,但还处于不可运行状态。就绪状态:新建线程后,调用该线程start()方法就可以启动线程。此时线程进入线程队列排队,并等待CPU分配资源。当线程启动时,进入该状......
  • 2023 Java面试题,看看你能答出来几道题目。
    下面是近一个月市面上收集的几道面试题(有传统企业,也有电商),答案会不定期更新在本篇文章中,你如有不同的见解,也可在评论区交流。1、jwt如何应用2、聊聊权限校验框架security,它由哪些部分组成3、业务设计:10min内超过30次登录限制登录。使用redis中zset实现,限流算法4、springboot......
  • Java基础的运算符和程序流程控制
    1.运算符计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:算术运算符赋值运算符关系运算符逻辑运算符三目运算符位运算符1.1算术运算符算术运算符用在数学表达式中,它们的作用和在数......
  • 学习一年java思想总结
    如果你迷茫不妨看看我的思想总结java这门语言是一门非常厉害的,期初我是学python的越往后学,我就感觉不是特别喜欢。然后某天晚上我打开以前的java的一个简单项目。突然就喜欢上了,下定决心去学java。我先开始学的java基础。还是那就话java入门简单深入难,刚开始学基础语法......
  • Java基础 File 常见的成员方法(获取并遍历)—— listFiles ()
    public File[] listFiles()  →  获取当前该路径文件夹下所有内容,把所有的内容放到数组中返回Filef=newFile("E:\\Java基础资料");File[]files=f.listFiles();for(Filefile:files){//file依次表示Java基础资料文件夹里面的每一个文件或者文件夹Sys......