java8 默认方法_Java 8的默认方法:可以做什么和不能做什么?

java8 默认方法

什么是默认方法

在Java 8发行版中,您可以修改接口以添加新方法,以便该接口与实现该接口的类保持兼容。 万一您开发了一个库,该库将由基辅到纽约的几位程序员使用,那么这非常重要。 在Java 8出现之前,如果您在库中发布了接口,则您不能添加新方法,而不必冒险在接口中实现的某些应用程序会随接口的新版本而中断。

使用Java 8,这种恐惧消失了吗? 没有。

向接口添加默认方法可能会使某些类无法使用。

首先让我们看一下默认方法的要点。

在Java 8中,可以在接口中实现一种方法。 (从Java8开始,静态方法也可以在接口中实现,但这是另一回事。)在接口中实现的方法称为默认方法,用关键字default表示为修饰符。 当类实现接口时,它可以但不必实现已经在接口中实现的方法。 该类继承默认实现。 这就是为什么在实现接口的更改时可能无需触摸类的原因。

多重继承?

当一个具体的类实现多个(例如两个)接口并且这些接口实现相同的默认方法时,事情就变得复杂起来。 该类将继承哪个默认方法? 答案是否定的。 在这种情况下,该类必须自己实现该方法(直接实现或通过继承更高级别的类)。

当只有一个接口实现默认方法而另一个仅将其声明为抽象方法时,也是如此。 Java 8试图受到约束,并避免“隐式”的事情。 如果在多个接口中声明了这些方法,则不会继承任何默认实现,则将出现编译时错误。

但是,如果您已经编译了类,则不会出现编译时错误。 这样Java 8不一致。 它有其原因,我不想在这里详述或出于各种原因而进入辩论(例如:发布已结束,辩论时间很长,并且从未在此平台上使用)。

  • 假设您有两个接口,还有一个实现这两个接口的类。
  • 接口之一实现默认方法m()
  • 您编译所有接口和类。
  • 您更改不包含方法m()的接口,以将其声明为抽象方法。
  • 仅编译修改后的接口。
  • 运行课程。

多重继承
在这种情况下,该类将运行。 您不能使用修改后的接口再次对其进行编译,但是如果它是使用较旧版本进行编译的:它仍然可以运行。 现在

  • 修改具有抽象方法m()的接口并创建默认实现。
  • 编译修改后的接口。
  • 运行类:失败。

当有两个接口为同一方法提供默认实现时,该方法不能在实现类中调用,除非由该类实现(再次:直接或从另一个类继承)。

多重继承2 该类是兼容的。 可以使用新界面加载它。 只要两个接口中都没有默认实现的方法的调用,它甚至可以开始执行。

样例代码

多重继承目录

为了演示上述内容,我为类C.java创建了一个测试目录,并为文件I1.javaI2.java的接口创建了三个子目录。 测试的根目录在文件C.java包含类C的源代码。 目录base包含适合执行和编译的接口版本。 I1包含具有默认实现的方法m() 。 接口I2目前不包含任何方法。

该类包含一个main方法,因此我们可以在测试中执行它。 它测试是否有任何命令行参数,因此我们可以轻松地执行它,而无需调用方法m()

~/github/test$ cat C.java 
public class C implements I1, I2 {public static void main(String[] args) {C c = new C();if( args.length == 0 ){c.m();}}
}
~/github/test$ cat base/I1.java 
public interface I1 {default void m(){System.out.println("hello interface 1");}	
}
~/github/test$ cat base/I2.java 
public interface I2 {
}

我们可以使用命令行来编译和运行该类:

~/github/test$ javac -cp .:base C.java
~/github/test$ java -cp .:base C
hello interface 1

compatible目录包含声明了方法m()抽象的接口I2版本,并且由于技术原因,它包含未I1.java

~/github/test$ cat compatible/I2.java public interface I2 {void m();
}

这不能用于编译类C

~/github/test$ javac -cp .:compatible C.java 
C.java:1: error: C is not abstract and does not override abstract method m() in I2
public class C implements I1, I2 {^
1 error

该错误信息非常准确。 即使我们具有先前编译中的C.class ,并且即使在compatible目录中编译接口,我们仍将有两个接口可用于运行该类:

~/github/test$ javac compatible/I*.java
~/github/test$ java -cp .:compatible C
hello interface 1

wrong的第三个目录包含I2版本,该版本还定义了方法m()

~/github/test$ cat wrong/I2.java 
public interface I2 {default void m(){System.out.println("hello interface 2");}
}

我们甚至不应该去编译它。 即使该方法是双重定义的,只要不调用该方法,该类仍然可以执行,但是只要我们尝试调用方法m() ,它就会失败。 这就是我们使用命令行参数的目的:

~/github/test$ javac wrong/*.java
~/github/test$ java -cp .:wrong C
Exception in thread "main" java.lang.IncompatibleClassChangeError: Conflicting default methods: I1.m I2.mat C.m(C.java)at C.main(C.java:5)
~/github/test$ java -cp .:wrong C x
~/github/test$

结论

当您开始将库移至Java 8并修改接口以添加默认实现时,您可能不会遇到问题。 至少这是Java 8库开发人员希望将功能方法添加到集合中的方式。 使用您的库的应用程序仍然依赖没有默认方法的Java 7库。 使用和修改不同的库时,冲突的可能性很小。 怎么避免呢?

像以前一样设计您的库API。 不要轻易依赖默认方法的可能性。 他们是不得已的选择。 明智地选择名称,以避免与其他接口冲突。 我们将学习如何使用此功能来开发Java编程。

翻译自: https://www.javacodegeeks.com/2014/04/java-8-default-methods-what-can-and-can-not-do.html

java8 默认方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光纤收发器tx和rx是什么意思?二者有什么区别?

现如今,在视频监控工程的高清视频图像传输中,一般都会使用光纤收发器,光纤收发器也被称之为光电转换器(Fiber Converter),可以将短距离的双绞线(网线)电信号和长距离的光信号(光纤)进行互换的以太网传输媒体转换设备,这…

jvm分配内存_为JVM分配内存:一个案例研究

jvm分配内存这篇文章是关于最近的性能调整练习的。 与往常一样,这些开始于关于症状的模糊表述。 这次,魔鬼采取了“应用程序速度慢,我们无权访问源代码的形式。 我们有什么选择来改善局势”。 对该应用程序进行仔细查看后发现,它…

如何在Spring Boot应用程序中使用配置文件

你好朋友, 在本教程中,我们将学习如何在Spring Boot应用程序中使用配置文件。 我们将在本教程中讨论以下几点: 1.什么是Spring Boot Profile,为什么我们需要分析 2.如何使用示例在Spring Boot中进行性能分析 3.如何设置/更改默…

光纤收发器常见故障问题的时候我们该如何解决呢

当我们在使用光纤收发器的时候,难免会遇到一些问题,当遇到这些常见故障问题的时候我们该如何解决呢?接下来就由飞畅科技的小编来为大家详细介绍下光纤收发器常见故障问题排查方法,一起来看看吧! 一、整体故障排查法 1…

光纤收发器的AB端可随便连接吗?

对于光纤收发器而言,收发器的主要作用是延长网络传输距离,可在一定程度上缓解了网线无法远距离传输的缺陷,为最后一公里传输带来了便捷,但是对于刚接触收发器的人来说会犯一些最为常见的错误,如光纤收发器的发射端与接…

JSON和XML:它们如何比较?

JSON和XML:它们如何比较? JSON和XML是两种人类可读的文本格式,多年来已成为竞争对手。 XML的目的是通过可选使用模式来存储和定义文档和数据。 JSON几乎与之完全相反-序列化格式的要求非常简单,可以放在信用卡背面。 但是&#xf…

光纤收发器故障导致不能上网该如何解决?

光纤收发器的作用就是光信号和电信号之间的相互转换,其过程大概为:把电信号转换为光信号,通过光纤传送出去,在另一端再把光信号转化为电信号,再接入路由器、交换机等等设备。但是,光纤收发器在使用过程中难…

光纤收发器分发射和接收吗?光纤收发器配对使用问题详解!

光纤收发器是光口与电口之间的转换,是网口通过光纤来延伸的一种设备,光纤收发器作为光电转换设备一般是成对使用,但也可以出现光纤收发器与光纤交换机、光纤收发器与SFP收发器配对使用也是可以的,原则上只要光传输波长是一样的、信…

光纤收发器元器件指标详情

在以太网光纤收发器设计中,元器件的选择举足轻重,它决定了产品的性能、寿命和成本。光电介质转换芯片(OEMC)是整个收发器的核心。选择介质转换芯片是以太网光纤收发器设计的第一步,也是非常重要的一步。它的选择直接影响和决定了其它元器件的…

如何在网络中成对使用光纤收发器?

我们知道,传统以太网中非屏蔽双绞线的传输距离只能达到100米,而且很容易受到电磁干扰(EMI),导致网络性能不佳。以太网光纤收发器的出现有效地将传统以太网和现代光纤网络结合在一起,完美地解决了上述问题。那么,如何在…

职业综合英语 章节答案考试答案 深圳职业技术学院[渝粤教育]

教育 -职业综合英语-章节资料考试资料-深圳职业技术学院【】 Quiz 1、【判断题】 Google is the world’s most popular website. A、正确 B、错误 参考资料【 】 2、【判断题】Larry Page set up Google in January 1996 at Stanford. A、正确 B、错误 参考资料【 】 3、【判断…

什么是工业光纤收发器,工业收发器的作用是什么?

工业收发器是发射器和接收器的组合,两者共享公共电路。通常,收发器用于无线通信系统中。从历史上看,收发器用于将计算机连接到外围设备,例如打印机,键盘,调制解调器,操纵杆和鼠标。当前&#xf…

自动化测试在CI CD管道中的作用

业界广泛采用的软件开发实践:持续集成和持续部署可确保良好地交付产品并经常交付。 常规代码提交需要常规/连续测试,而如果忽略它,则可能导致基础架构无法恢复。 如何交付坚固的CI CD管道? 对于许多公司来说,这是一个问…

单模单纤光纤收发器指示灯及故障问题详解

光纤收发器是现在网络传输中应用比较广泛的设备了,其特点是成对使用,体积小,传输距离远(25KM)。在实际应用中难免会碰到一些故障,现杭州飞畅科技的小编就光纤收发器使用过程中的相关指示灯及故障问题整理如…

POE供电光纤收发器在网络监控中的应用

现如今,随着安防行业的不断发展,在传输信号的过程中对载体提出了更高的要求。光口交换机固然有其成本,市场化程度高等优点,但在网络摄像机越来越多的运用到光纤收发器加光纤交换机的方案。接下来就由飞畅科技的小编来为大家介绍下…

javafx canvas_JavaFX技巧2:使用Canvas API进行清晰绘图

javafx canvas最初开始使用Canvas API时,我注意到渲染代码的结果有些模糊,甚至更糟,不一致。 有些线条模糊,有些线条清晰。 来自Swing,我花了一些时间才意识到这是由JavaFX的坐标系引起的,该坐标系允许双精…

Zing加快了JVM应用程序的预热

Java虚拟机(JVM)提供了托管运行时环境,用于安全部署应用程序,其性能通常可以超过本机编译语言(如C和C )的性能。 通过即时(JIT)编译进行垃圾收集和自适应编译的内存管理是两个最突出…

多模光纤收发器的基本参数及主要特点

多模光纤收发器具备地址过滤、网络分段及智能报警等功能,可提高网络工作效率及网络运行可靠性。飞畅科技10/100M双芯多模自适应以太网光纤收发器,采用最新美国KENDIN芯片,高品质光收发一体模块,性能稳定,质量优良。适用…

没有垃圾回收的JVM

JVM社区不断增加新的GC,最近又添加了一个新的GC,它称为Epsilon ,是非常特殊的一个。 Epsilon仅分配内存,但不会回收任何内存。 看起来好像不执行任何垃圾回收的GC用途是什么。 这种类型的垃圾收集器有特殊用途,我们将…

多模光纤收发器的应用领域及适用领域

双纤多模高性能10/100Mbit自适应光纤收发器(光电转换器),具备地址过滤、网络分段及智能报警等功能,可提高网络工作效率及网络运行可靠性。可实现最远5公里无中继计算机数据网的高速远程互连。产品性能稳定可靠,设计方面…