Java8 接口的默认方法和静态方法

Java8接口–默认方法和静态方法 在Java8之前,java中的接口只能有抽象方法。默认情况下,接口的所有方法都是公共和抽象的。Java8允许接口具有默认和静态方法。我们在接口中使用默认方法的原因是,允许开发人员向接口添加新方法,而不会影响实现这些接口的类。 为什么选择默认方法? 例如,如果A、B、C和D等几个类实现了一个接口XYZInterface,那么如果我们向XYZInterface添加一个新方法,我们必须更改实现该接口的所有类(A、B、C和D)中的代码。在本例中,我们只有四个类实现了我们想要更改的接口,但... 阅读详情

今天面试的时候被问到Java中接口中定义的方法是否支持方法体,印象中不能,然而Java 8以后是可以的!!!Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。默认方法使得接口有点类似traits,不过要实现的目标不一样。默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。

默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写,例子代码如下:

private interface Defaulable {
    // Interfaces now allow default methods, the implementer may or 
    // may not implement (override) them.
    default String notRequired() { 
        return "Default implementation"; 
    }        
}
 
private static class DefaultableImpl implements Defaulable {
}
 
private static class OverridableImpl implements Defaulable {
    @Override
    public String notRequired() {
        return "Overridden implementation";
    }
}

Defaulable接口使用关键字default定义了一个默认方法notRequired()。DefaultableImpl类实现了这个接口,同时默认继承了这个接口中的默认方法;OverridableImpl类也实现了这个接口,但覆写了该接口的默认方法,并提供了一个不同的实现。

Java 8带来的另一个有趣的特性是在接口中可以定义静态方法,例子代码如下:

private interface DefaulableFactory {
    // Interfaces now allow static methods
    static Defaulable create( Supplier< Defaulable > supplier ) {
        return supplier.get();
    }
}

下面的代码片段整合了默认方法和静态方法的使用场景:

public static void main( String[] args ) {
    Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
    System.out.println( defaulable.notRequired() );
 
    defaulable = DefaulableFactory.create( OverridableImpl::new );
    System.out.println( defaulable.notRequired() );
}

这段代码的输出结果如下:

Default implementation
Overridden implementation

由于JVM上的默认方法的实现在字节码层面提供了支持,因此效率非常高。默认方法允许在不打破现有继承体系的基础上改进接口。该特性在官方库中的应用是:给java.util.Collection接口添加新方法,如stream()、parallelStream()、forEach()和removeIf()等等。

尽管默认方法有这么多好处,但在实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。

public class scratch {
    public static void main(String[] args) {
        System.out.println(Demo.create("test"));
    }
    private interface Demo {
         //可定义多个静态方法
        static String create(String string) {
            System.out.println(string);
            return string + "1111111111111";
        }
    }
}

结果:

test
test1111111111111
CTK Plugin Framework插件框架学习1--Qt编译CTK 【代码】Qt编译CTK。 阅读详情

相关推荐

数学不好是原罪——高等数学笔记(汇总版)

这是本人之前考研的高数手写笔记,工科学硕数一考了146(满分150),笔记有一定参考价值,欢迎大家收藏借鉴。

xuuyann 5万+

java接口的静态方法

因为 比如 你有 A B两个接口 他们都写了一个静态方法 然后 C类继承了两个接口 然后 C类调用了 A B接口都有点那个静态方法 那么计算机就蒙了 你调的到底是 A的还是B的静态方法呢?这里 大家就可以看出 我们静态方法 因为是有方法体的 所以也是可以不用重写的 当然 接口的静态方法 你也不需要重写 重写你也用不了。所以 为了避免争议 java直接封了实现类调用接口静态方法的写法 你想用接口的静态方法 就要用接口名去调。

weixin_45966674的博客 2745

【保姆级教程/代码】GNSS反演大气可降水量(Precipitable Water Vapor, PWV)

GPS精密单点定位(PPP)是一种采用精密卫星星历和卫星钟差进行非差单点定位的方法,在观测过程中采用双频载波相位观测法以确保高精度定位精度。本文利用PPP技术来求解天顶对流层延迟(zenith tropospheric delay,ZTD)。ZTD由湿延迟(ZWD)和干延迟(ZHD)组成,其中占比90%的ZHD与地面测站高程、大气压和测站纬度等参数有良好的相关性,可以通过Saastamoinen模型精确求出;

weixin_43910227的博客 2926

接口中的静态方法和默认方法

默认方法解决的问题场景: 有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题。 静态方法解决的场景: 接口静态方法类似于默认方法,但是我们不能在实现类中覆盖它们,可以避免默认方法在实现类中被覆盖实现。 总结: 1、接口默认方法、静态方法可以有多个。 2、默认方法通过实例调用,静态方法通过接口名调用。 3、default默认方法关键字只能用在接口中。 4、默认方法可以被继承,如果继承了多个接口,多

weixin_41909330的博客 5656

【计算机视觉】基于复杂环境下的车牌识别

本文针对复杂环境下(光照变化、车牌变形、噪声干扰)的车牌识别问题,提出了一套完整的优化方案。通过四个核心环节进行改进:1)采用CLAHE、同态滤波等技术优化光照处理;2)使用边缘检测和透视变换应对车牌变形;3)结合中值滤波和暗通道去噪算法消除干扰;4)改进字符分割与识别方法。文章提供了详细的Python实现代码,展示了从预处理到字符识别的完整流程,并通过多策略融合显著提升了复杂场景下的识别准确率。实验结果表明,该方法能有效应对各类复杂环境挑战,为实际应用提供了可靠解决方案。

2401_84149564的博客 1627

西门子 S7-200 SMART 系列六:手把手教你配置S7-200 SMART Modbus RTU

最新发表:https://www.ics-pedia.com/%e8%a5%bf%e9%97%a8%e5%ad%90-s7-200-smart-%e7%b3%bb%e5%88%97%e5%85%ad%ef%bc%9a%e6%89%8b%e6%8a%8a%e6%89%8b%e6%95%99%e4%bd%a0%e9%85%8d%e7%bd%aes7-200-smart-modbus-rtu%e5%ae%9e%e4%be%8b/

John_09040211的博客 3279

Java接口中的静态(static)方法和默认(default)方法

如何创建接口默认方法:在接口中的方法签名中使用default关键字。使用default修饰,不可省略,供子类调用或者子类重写可以继承,可以重写,二选一,但是只能通过实现类的对象来调用接口中,有多个默认方法时,实现类都可继承使用,如果继承方法有重名的,必须重写一次1、接口默认方法将帮助我们扩展接口,而不必担心破坏实现类。2、接口默认方法缩小了接口和抽象类之间的差异。3、接口默认方法使得我们无需创建基类,由实现类自己选择覆盖哪个默认方法实现。

m0_74352735的博客 3844

Agentic RAG:RAG从静态到具有理解、推理、决策的Agentic RAG

RAG技术演进:从静态检索到智能代理 RAG(检索增强生成)技术经历了五个关键发展阶段:基础RAG(关键词检索)、高级RAG(语义理解)、模块化RAG(灵活架构)、图RAG(知识图谱)和最新的Agentic RAG(智能代理)。Agentic RAG通过引入自主AI代理,具备反思、规划、工具使用和多代理协作能力,实现了动态决策和自适应工作流。相比传统RAG的静态检索流程,Agentic RAG能处理复杂多步推理任务,通过自我改进机制提高输出质量,并支持多专业代理协作,显著提升了RAG系统在复杂场景下的表现。

2538

接口的默认方法和静态方法

接口的默认方法和静态方法

硅脂味咖啡的博客 1373

【Cadence 17.4实战】----- 基于MySQL与ODBC的企业级CIS数据库配置全攻略

本文详细介绍了如何在Cadence 17.4中配置基于MySQL与ODBC的企业级CIS数据库,提升硬件设计团队的元器件管理效率。通过实战案例和避坑指南,帮助读者掌握数据库部署、ODBC驱动配置及CIS参数映射等关键技巧,实现设计数据的实时同步与高效管理。

weixin_30591551的博客 327

国科大作业考试资料《人工智能原理与算法》2024新编-第二次作业整理

1、对于下列活动,分别给出任务环境的PEAS描述, 并按2.3.2节列出的性质进行分析: 3、为图2.2中描述的吸尘器世界实现一个可以进行性能度量的环境模拟器。你的实现是必须是模块化的,以使传感器、执行器和环境特征(大小、形状、灰尘放置等)便于修改。 4、实现上述题目真空吸尘器环境中的简单反射Agent。用所有可能的初始灰尘分布和Agent位置,运行环境模拟器和Agent。记录Agent在每种情况下的性能评分和总体平均评分。

MatsumotoChrikk 1187

Java 8 接口的默认方法和静态方法

在Java 8中,接口得到了一些重要的更新,其中包括引入了默认方法和静态方法的概念。默认方法允许在接口中提供默认实现,而静态方法则允许在接口中定义静态方法。这些新特性为Java的接口增加了更多的灵活性和功能。本教程将介绍Java接口的默认方法和静态方法的概念和用法。

qq_38766930的博客 1553

2025华为od面试手撕代码【求字符串表达式结果】

2025华为od面试手撕代码【求字符串表达式结果】

MISAYAONE的博客 1353

Java8——接口的默认方法和静态方法

开始我们也提到,interface 新增default和static修饰的方法,为了解决接口的修改与现有的实现不兼容的问题,并不是为了要替代abstract class。JVM平台的接口的默认方法实现是很高效的,并且方法调用的字节码指令支持默认方法。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。

持之以恒! 1814

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JAVA8 为什么要有接口默认方法和静态方法

什么是默认方法和静态方法? Java 8 开始是可以有方法实现的,可以在接口中添加默认方法和静态方法。 默认方法用 default 修饰,只能用在接口中,静态方法用 static 修饰,这个我们不陌生了。并且接口中的默认方法、静态方法可以同时有多个。 为什么要有接口默认方法? 举一个很现实的例子: 我们的接口老早就写好了,后面因为各种业务问题,避免不了要修改接口。 在 Java 8 之前,比如要在一个接口中添加一个抽象方法,那所有的接口实现类都要去实现这个方法,不然就会编译错误,而某些实现类根本就不需要实现

Falser101的博客 2690

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java 8 之接口的静态方法和默认方法

Java 8接口的变化包括接口中的静态方法和默认方法。在Java 8之前,接口中只能有方法声明。但是从Java 8开始,我们可以在接口中使用默认方法和静态方法。 目录Java 8接口Java接口默认方法Java接口静态方法Java函数式接口 Java 8接口 接口设计一直是一项艰巨的工作,因为如果我们想在接口中添加其他方法,则将需要对所有实现类进行修改。随着接口的过时,实现它的类的数量可能会增加到无法扩展的程度。所以在设计应用程序时,很多时候都会提供一个基础实现类,然后在对其进行扩展并覆盖适用于应用程序的方

Symon的博客 1026

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?

写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法。而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法和静态方法。 接口中的默认方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 default 关键字修饰 。 例如,我们可以定义一个接口MyFunction,其中,包含有一个默认方法getName,如下所示。 public interface MyFunction&l

冰河的专栏 2045

Java8新特性—接口的默认方法和静态方法

Java 8中新增的接口的默认方法和静态方法提供了更加灵活和方便的接口设计方式。默认方法可以解决接口升级的问题,使得我们可以在不破坏已有代码的情况下向接口中添加新的方法。静态方法可以定义通用的工具方法,使得我们可以在不同的实现类中重复使用这些方法。在实际开发中,我们应该根据具体的业务需求来选择使用接口的默认方法和静态方法,以提高代码的复用性和可维护性。

小薯条的博客 1872

java8接口默认方法静态方法和重复注解

接口默认方法和静态方法 默认方法 interface MyInterface1 { default String method1() { return "myInterface1 default method"; } } class MyClass{ public String method1() { return "myClass method"; } } /** * 父类和接口中都有相同的方法,默认使用父类的方法,即类优先 * @author 莫雨朵 * */ c...

ElegantHedgehog的博客 433

JAVA8 接口的默认方法和静态方法

Java 8 引入了两个重要的新特性到接口中:默认方法(Default Methods)和静态方法(Static Methods)。这些特性增强了Java接口的功能性,同时向后兼容旧版本的Java代码。默认方法(Default Methods)默认方法允许在接口中包含具有实现体的方法,而不是像以前版本的Java那样,接口中...

weixin_30046717的博客 173

JAVA 8的接口默认方法和静态方法

在Java 8中,接口得到了显著的增强,包括引入默认方法(Default Methods)和静态方法(Static Methods)。这些新特性增加了接口的灵活性和功能性。

2301_79507619的博客 370

Java 8 新特性—接口默认方法和静态方法

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!

smart_an的专栏 1200

Java 8 新特性:接口的静态方法和默认方法

Java 8 新特性:接口增强文 | 莫若吻      1.接口增强Java 8 对接口做了进一步的增强。a. 在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)b. 接口里可以声明静态方法,并且可以实现。2.默认方法(或扩展方法)Java 8 允许给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法(也称为默认方法或...

Promise Sun special column 5万+

java8 接口的默认方法和静态方法

JAVA 8中引入的默认方法和静态方法是在接口中能够具有方法体的,分别被default和static关键字修饰的方法。

YJH000_的博客 444

Java8新特性——接口中的默认方法和静态方法

Java8新特性——接口中的默认方法和静态方法

贝尔摩德苦艾酒 7130

[Java8]接口中的默认方法和静态方法

接口中的默认方法与静态方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 default 关键字修饰。 接口默认方法的” 类优先” 原则若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时 选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。 接口冲突。如果一个父接口提供一个默认方法,而...

Go_Run的博客 445
上一篇: Spring AOP 的实现方式(以日志管理为例)
下一篇: Redis保护模式配置引起的问题
小许子是逗星人
博客等级 码龄11年 2粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值