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,一经查实,立即删除!

相关文章

【渝粤教育】国家开放大学2018年春季 0609-22T中级财务会计(1) 参考试题

科目编号:0609 座位号 2017-2018学年度第二学期期末考试 中级财务会计(1) 试题 2018年 7 月 一、单选题(本大题共10小题,每小题3分,共计30分) (★请考生务必将答案填入到下面对应序…

光纤模块和光纤收发器匹配问题

光纤收发器与光模块在很多光纤传输项目中都有用到,二者都是光电转换设备,通过光模块与光纤收发器的灵活搭配,可以构建多样化的网络结构。那么,光纤模块和光纤收发器连接时要注意什么呢?今天就由飞畅科技的小编来为大家…

【渝粤教育】国家开放大学2018年秋季 0239-21T电子商务物流管理 参考试题

试卷代码:0257 2018-2019学年度第一学期期末考试 高级英语听力(1)试题 2019年1月 注 意 事 项 一、将你的准考证号、学生证号、姓名及分校(工作站)名称填写在答题纸规定栏内。 考试结束后,把试卷和答题纸放…

【渝粤教育】国家开放大学2018年秋季 0699-21T阅读与写作 参考试题

科目编号:0703 座位号 □□ 2018-2019学年度第一学期期末考试 经济学基础 试题 2019年1月 一、单项选择题:(每题4分,共40分) 一个经济体系必须回答的基本问题( ) A.生产什么&#…

大模型系列之模型参数冻结

第一、冻结的参数设置成False 比如说仅训练embedding层参数 for name, param in model.named_parameters():if "model.embed_tokens" not in name:param.requires_grad False第二、优化器过滤False的参数 optimizer AdamW(filter(lambda p: p.requires_grad, mo…

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

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

【渝粤教育】国家开放大学2018年秋季 1133t文献检索 参考试题

试卷代号:1152 教育法学 试题 2019年1月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试 结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完 考卷和答题纸后才可离开考场。…

【渝粤教育】国家开放大学2018年秋季 1353T高级英语阅读(1) 参考试题

试卷代号:1359 高级英语写作试题 2019年1月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完考卷和答题纸后才可离开考场。…

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

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

【渝粤教育】国家开放大学2018年秋季 2202T公共行政学 参考试题

试卷代号:2223 物业管理财税基础 试题(开卷) 2019年1月 一、单项选择题(每空2分.共20分) 1.某物业管理企业2017年取得银行存款利息收入2 000元,应作( )处理。 A.管理费用增加 B&…

光纤收发器常见的一些问题和检测方法

光纤收发器,是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元,在很多地方也被称之为光电转换器(Fiber Converter)。光纤收发器的基础知识我们已经看到过很多,今天就由飞畅科技的小编来给…

【渝粤教育】国家开放大学2018年秋季 2610T药剂学 参考试题

试卷代号:2704 植物学基础 试题 2019年1月 一、单项选择题(每小题3分,共15分) 1.具有较大的细胞间隙,常形成气腔或气道是( )组织。 A.同化 B.储藏 C.通气 D.叶…

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

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

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

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

【渝粤教育】国家开放大学2018年秋季 3818-22T燃气工程施工 参考试题

试卷代号:3912 汽车底盘构造与维修试题答案及评分标准 (供参考) 2019年1月 一、单项选择题(下列各题的备选答案中,只有一个选项是正确的,请把正确答案的序号填写在括号内。15小题,每小题2分&am…

【渝粤教育】国家开放大学2018年秋季 8180-21T (1)畜禽生产概论 参考试题

试卷代号:8184 座位号 2018-2019学年度第一学期期末考试 护理伦理学 试题 2019年1月一、名词解释:(每题5分,共20分) 1.护理伦理学 2.护理道德情感 3.安乐死 4.慎独 二、选择题:(每小题3分&a…

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

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

【渝粤教育】国家开放大学2019年春季 0408-22T管理学基础 参考试题

科目编号:0408 管理学基础 试题 2019年7月 单项选择:(每小题3分,共计30分) 1.管理的首要职能是( )。 A.计划 B.控制 C.协调 D.指挥 2.人们常说“…

变异测试 java_编码的喜悦……以及Java中的变异测试

变异测试 java多年以来,为源代码编写单元测试一直是一种好习惯。 并且还可以使用测试覆盖率报告来查看测试覆盖了多少代码。 尽管行分支覆盖率报告非常有用,但是它并不能告诉您单元测试的实际效果。 因此,甚至在测试中没有一个断言的情况下&a…

【渝粤教育】国家开放大学2019年春季 1009离散数学(本) 参考试题

试卷代号:1009 2019年春季学期期末统一考试 离散数学(本)试题(半开卷) 2019年7月 一、单项选择题(每小题3分,本题共15分) 1.若集合A{1,2,3),则下列表述正确的…