默认方法和多重继承

最近卢卡斯JOOQ埃德尔发布和文章有关嵌套类及其使用。 这是一个有趣的话题,他的文章一如既往地有趣并且值得一读。 我只同意一个简短的声明,我们有一个简短的回复链,导致默认方法,以及为什么不能有类似的东西

class Outer {<non-static> interface Inner {default void x() {System.out.println(Outer.this.toString());}}Inner2 y() {return new Inner2();}
}class Inner2 implements Inner {
}// This would now print Outer.toString()
// to the console
new Outer().y().x();

在Java中。 可以这么说,在上面的代码中,内部接口的默认方法将引用包围该接口的实例。 我认为“答复”不是最佳的沟通方式,因为最初的话题有所不同,我现在就去谈谈。

什么是默认方法

你可能知道。 如果不是google,或者阅读我的文章Java 8默认方法:可以做什么和不能做什么? 以及如何不使用Java 8默认方法 。

如果您用谷歌搜索,您会发现Java 8中的默认方法带来了迦南语,多重继承是可用的。

与真正了解Java的专业人士在stackoverflow上进行了很好的讨论:

Java一直具有类型的多重继承。 默认方法增加了行为的多重继承,但没有状态的多重继承。 (大多数麻烦源于C ++等语言中状态的多重继承。)– Brian Goetz 2014年 6月21日,2:05

在本文中,我将研究如何解释和理解该声明。

继承类型

Brian Goetz的话中提到:

  • 类型的继承
  • 行为的继承,以及
  • 国家的继承。

类型的继承非常容易,并且对于Java程序员是众所周知的。 您可以在接口中定义抽象方法,但不指定抽象方法的工作方式,而仅指定方法的返回值和签名。 Java 8使用默认方法引入了行为继承而不是状态继承。 但是,您是否真的可以拥有行为继承而不拥有状态继承呢? 并不是的。 至少在Java 8中,您可以继承状态,尽管不建议这样做,它的执行效果不佳(我的意思是:它可能很慢),而且程序繁琐且容易出错。 但是可以,我将在这里展示如何操作。 (除了我在上面提到的文章中发布的线程本地废话之外。)

我相信Java 8发明者希望使用默认方法在标准运行时实现功能接口(例如流)时保持向后兼容性。 最近,我观看了Fargo系列,我觉得语言设计师对问题“是您真正想要的吗?”的回答是“是”。

使用默认方法进行状态继承

默认方法无法访问字段(静态字段除外,静态字段无论如何在接口中都是最终的,因此让我们暂时忘记它们)。 就像您无法从扩展了A的B类访问A类的私有字段一样。反之亦然:您无法从A访问B的私有字段。但是,您可以在B中拥有getter和setter,如果您声明了它们作为A中的抽象方法,您可以获得访问权限。 芝麻开门。 Getter和Setters是解决方案。

在接口中为要从默认方法访问的所有状态字段声明抽象方法时,可以访问它们。 这样,您将获得与真实状态继承相同的结果。 区别在于语法:您使用getter和setter方法而不是字段名称,并且必须在接口中声明这些方法。 通过这种方式,编译阶段会检查getter和setter是否确实存在。

您会看到Java 8的情况变得非常复杂。 将其与泛型混合使用,您可能找不到一个了解这一切的鲜活灵魂。 有一个结构,像

Outer.this.toString()

上面的示例代码中的代码可能会使它变得更加复杂,而没有实际的杠杆作用。

我相信我对Java 8中的默认方法以及如何使用它们有一定的了解。 但是,拥有10年Java和30年以上编程经验的经验不足以让我知道应该如何使用默认方法。 对于仍在生产代码中使用Java 1.6或更早版本的开发人员,我感到嫉妒:他们不必担心默认方法。 (这只是个玩笑。)

即使我尝试提供一些建议。

建议

切勿在默认方法中模仿状态继承。 虽然很难说出它在实践中是什么。 调用getter或setter显然是。 调用在实现类中实现的某些抽象方法可能会也可能不会。 如有疑问:最好不要。

永远不要使用我在另一篇文章中写的threadlocal技巧。

对于Java语言发明者使用的默认方法,使用默认方法:在库接口中保持向后兼容性。 如果您曾经发布过一个库并且它包含一个接口(否则,顺便说一句), 请不要对其进行更改...请考虑使用实现该接口的库来考虑客户端代码。 在Java 8中,您可以完成以下句子: 不要将其更改为不兼容的。 如果有一个新方法:创建一个默认实现,这样已经实现了先前版本的代码将保持兼容,并且无需扩展这些类。

翻译自: https://www.javacodegeeks.com/2015/02/default-methods-multiple-inheritance.html

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

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

相关文章

uniapp uni.request GET方式请求,不能直接传数组解决方法

这里写目录标题目录遇到的问题 GET请求方法传数组解决方案目录 遇到的问题 GET请求方法传数组 想传一个数组&#xff0c;但是后台接受到的数据与浏览器中显示的数据和前台代码传的不一样&#xff1b; 前台代码打印 浏览器显示数据 其中HerbalNameList &#xff0c;变成了字…

休眠CascadeType.LOCK陷阱

介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 &#xff0c;就该分析CascadeType.LOCK行为了。 休眠锁定请求触发内部LockEvent 。 关联的DefaultLockEventListener可以将锁定请求级联到锁定实体子级。 由于CascadeType.ALL也包括CascadeType.LOCK &#xff0c;因…

c++中在堆和栈中申请空间的差别

堆中和栈中申请的空间的比较, 我找到了下面的比较: 栈的情况&#xff1a;栈上分配空间的好处是快&#xff0c;而且对象生存期是自动的&#xff0c;离开当前域之后就自动析构回收。坏处就是栈空间有限&#xff0c;而且不能人为控制对象的生存期&#xff0c;比如你无法将一个函数…

推销自己的海盗猫王运营商

因此&#xff0c;Java没有Elvis运算符&#xff08;或者更正式的名称是null合并运算符或null安全成员选择&#xff09;……虽然我个人不太在意它&#xff0c;但有些人似乎很喜欢它。 当一位同事需要几天后&#xff0c;我坐下来探讨了我们的选择。 而且你知道什么&#xff01; 您…

sunos 查cpu主频指令prtdiag

sun查cpu主频指令 usr/sbin/psrinfo -v ...虚拟处理器 63 在下列时间的状态&#xff1a;09/10/2013 14:23:52自 04/08/2013 17:41:40 开始已在运行。sparcv9 处理器以 2660 MHz 运行,而且有 sparcv9 浮点数处理器 sun的prtdiag指令: 查cpu个数 bash-3.2$ uname -a SunOS m5000…

使用CDI简化JAX-RS缓存

这篇文章&#xff08;通过一个简单的示例&#xff09;说明了如何使用CDI Producers使其在RESTful服务中利用缓存控制语义更加容易 与HTTP 1.0中可用的Expires标头相比&#xff0c; HTTP 1.1中添加了Cache-Control标头&#xff0c;这是急需的改进。 RESTful Web服务可以利用此标…

字符串字符和数字分割

现在有个String类型的字符串&#xff1a; String str"AA120"; 我想把它分解成 AA &#xff1b;120 就是把数字和字母分开&#xff1b; 求方法 补充&#xff1a; 格式是前面是字母 不确定几位&#xff0c;后面是数字&#xff0c;也不确定几位 就是"AA111…

transform限制position:fixed的跟随效果

我们应该都知道&#xff0c;position:fixed可以让元素不跟随浏览器的滚动条滚动&#xff0c;而且这种跟随效果连它的兄弟们position:relative/absolute都限制不了。但是&#xff0c;真是一物降一物&#xff0c;position:fixed固定效果却被小小的transform给干掉了&#xff0c;直…

Maven提示:有关可执行jar的所有信息

Maven提示&#xff1a;有关可执行jar的所有信息 在分发代码时&#xff0c;可执行jar是非常有用的工具。 这意味着&#xff0c;只要将Java安装在客户端计算机上&#xff0c;至少在Windows和Mac上&#xff0c;您的用户只需双击jar即可启动程序。 另外&#xff0c;在命令行上&…

C# 查询一张表的数据用于补充另外一张表的数据 MySQL数据库

UPDATE bookhistory bh set bh.CategoryId (SELECT CategoryId FROM booklist bk where bk.Id bh.BookListId)

Gentoo man手册指南

转载&#xff1a;http://www.gentoo.org/doc/zh_cn/man-guide.xml#doc_chap2 http://blog.csdn.net/andyelvis/article/details/4044938 使用man命令技巧 Gentoo man手册指南 内容: 1. 简介2. 使用man结构 1. 简介 man程序 每一个人在他的linux人生中都使用…

Java 8 Lambda表达式教程

问候&#xff01; :) 离开几个月后&#xff0c;我决定恢复风格:)。 我注意到我以前有关新的Date / Time API的一篇文章非常受欢迎&#xff0c;因此这次我将把本篇文章专门介绍Java 8的另一个新功能&#xff1a; Lambda Expressions 。 功能编程 Lambda表达式是Java编程语言最…

React 父组件(hooks)调用子组件(calss)方法

父组件&#xff08;hooks&#xff09; let richTextRef {};<RichText getRichText{getRichText} content{content} onRef{ref > richTextRef ref} />子组件&#xff08;class&#xff09; componentDidMount () > {this.props.onRef && this.props.onRe…

[HDU] 2553 N皇后问题-简单深搜

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2553 方法&#xff1a; 1.可以用对称的思想&#xff0c;即&#xff1a;如果N是偶数&#xff0c;则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和&#xff0c;最后再乘以2。如果是奇数&#…

您真的了解@WebService吗?

SOAP Web服务无论如何都不是最先进的技术-尽管它仍然存在&#xff0c;但是基于REST的Web服务却提供了激烈的竞争。 无论如何–这绝对不是REST vs SOAP帖子&#xff01; 我观察到了一些实例&#xff0c;至少可以说&#xff0c;使用基于Java的SOAP Web服务的方式不太理想。 我认…

全局使用dva dispatch

// 第一种 这个umi2还可以 umi3就不可以了 window.g_app._store.dispatch({type: login/logout,});// 第二种 调用dispatch(所有models都可以) getDvaApp()._store.dispatch({type: login/logout,});

[转]JQuery.Ajax之错误调试帮助信息

本文转自&#xff1a;http://blog.csdn.net/lampsunny/article/details/8053967 下面是Jquery中AJAX参数详细列表&#xff1a; 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址。 type String (默认: "GET") 请求方式 ("POST&quo…

将策略插入JBoss Apiman

JBoss apiman项目 本周刚刚发布了1.0.3.Final 。 它主要是一个错误修复版本&#xff0c;仅进行了一些相对较小的改进。 自从我上次写博客以来&#xff0c;其中的一个特殊功能就是对插件的支持。 这些插件可以轻松添加到系统中&#xff0c;以提供其他功能。 将策略添加为插件 当…

Error: Module “xxx“ does not exist in container. / antd pro v5启用qiankun报错 / 同时使用mfsu和qiankun报错

一、问题描述 我们用antd pro v5搭建前端项目&#xff0c;启用qiankun微前端模式&#xff0c;终端报错如下&#xff1a; Uncaught (in promise) Error: Module “xxx” does not exist in container. while loading “xxx” from webpack/container/reference/mf 经过排查&…