注解默认继承_默认方法和多重继承

注解默认继承

最近卢卡斯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和Setter是解决方案。

在接口中为要从默认方法访问的所有状态字段声明抽象方法时,可以访问它们。 这样,您将获得与真实状态继承完全相同的结果。 区别在于语法:您使用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/338465.shtml

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

相关文章

暑期社会实践服务器维护,寒假网络维护社会实践报告

今年由于来学校返校报到的时间比较晚&#xff0c;我早到学校一星期了&#xff0c;就在学校附近的网吧做了一星期的网络维护社会实践&#xff0c;把一星期实践所学到的东西和遇到的问题做个总结&#xff1a;一、网络简介网络按照地域可分为&#xff1a;局域网、城域网与广域网。…

信工干货||C语言输入输出语句

数据输入与输出C语言无I/O语句&#xff0c;I/O操作由函数实现putchar( ) getchar( ) printf( ) scanf( ) puts( ) gets( )#include或#include “stdio.h”数据输出字符输出函数格式&#xff1a;putchar&#xff08;c&#xff09;参数&#xff1a;c为字符型或整型常量、变量或表…

如何设置网件gs108e_Netgear 网件 EAX80 AX6000规格 无线扩展器 开箱拆解评测

前言众所周知&#xff0c;国行网件RAX系列默认中国区&#xff0c;这就导致了路由器的发射功率不会高&#xff0c;所以很多人觉得国行RAX无线路由器信号覆盖不尽如意。为了解决这个问题&#xff0c;本次为大家介绍一款WiFi 6信号扩展器—EAX80(官网链接)&#xff0c;它可以将高强…

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

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

饥荒海难创建显示专用服务器,饥荒创建世界时一直显示启动服务器 | 手游网游页游攻略大全...

发布时间&#xff1a;2017-08-07TGP版怎么建立服务器呢?各位知道在TGP里如何创建服务器吗?这里给大家带来了TGP版服务器创建开服方法,教大家TGP如何创建服务器,还不会的玩家,一起来了解下吧. >&gt ...标签&#xff1a;攻略发布时间&#xff1a;2015-12-20联机过程中有…

C语言 | 6种常用的转换工具函数盘点

字符串转十六进制代码实现&#xff1a;void StrToHex(char *pbDest, char *pbSrc, int nLen){ char h1,h2; char s1,s2; int i; for (i0; i2; i) { h1 pbSrc[2*i]; h2 pbSrc[2*i1];s1 toupper(h1) - 0x30; //toupper 转换为大写字母 if (s1 > 9) s1…

企业联合体的形式_联合体如何联合?——总包新政下,联合体如何联合?系列三...

以下文字为根据科思顿企业咨询管理(上海)有限公司合伙人胡建于2020年4月10日的网课核心内容摘录&#xff0c;因内容较多&#xff0c;分三个系列发布&#xff0c;包括&#xff1a;系列之一、为什么政策突变&#xff1f;系列之二、联合体是什么&#xff1f;系列之三、联合体如何联…

netflix_学习Netflix管理员–第1部分

netflix最近几天&#xff0c;我一直在与Netflix Governator合作&#xff0c;并尝试使用Governator尝试一个小样本&#xff0c;以将其与Spring Framework的依赖项注入功能集进行比较。 以下内容并不全面&#xff0c;我将在下一系列文章中对此进行扩展。 因此&#xff0c;对于没…

laravel ajax ip,怎么在Laravel中利用AJAX动态刷新部分页面

怎么在Laravel中利用AJAX动态刷新部分页面发布时间&#xff1a;2021-02-17 13:12:43来源&#xff1a;亿速云阅读&#xff1a;119作者&#xff1a;Leah怎么在Laravel中利用AJAX动态刷新部分页面&#xff1f;很多新手对此不是很清楚&#xff0c;为了帮助大家解决这个难题&#xf…

vue2 怎么用vite_Vue2和Vue3开发组件有什么区别

我们一直都有关注和阅读很多关于Vue3的新特性和功能即将到来。但是我们没有一个具体的概念在开发中会有如何的改变和不一样的体验。还有一些童鞋已经开始又慌又抓狂了 -- “又要开始学新的写法了 (ノToT )ノ ~┻┻”。所以这里我使用Vue2和Vue3开发一个简单的表格组件来展示一下…

C语言中实现边沿函数算法及应用,这是抛弃PLC留下的痛!

很多从事PLC编程的朋友都知道&#xff0c;不管是什么品牌的PLC&#xff0c;都有上升沿和下降沿指令。❤那么什么情况下我们才会使用或必须使用边沿信号呢&#xff1f;边沿信号我们又如何获取呢&#xff1f;如图1&#xff0c;任何一个开关信号&#xff08;或数字信号&#xff09…

jboss将war放在那?_将策略插入JBoss Apiman

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

服务器系统装驱动精灵,云服务器安装驱动精灵

云服务器安装驱动精灵 内容精选换一换您可以选择在云服务器上安装一个或多个应用。如需在云服务器上安装其他应用&#xff0c;请参考如下操作进行添加。暂时仅允许支持VR应用的云服务器安装VR应用。暂时仅允许支持3D应用的云服务器安装3D应用。暂时仅允许支持VR应用的云服务器有…

注入器 过检测_连云港管道检测服务

连云港管道检测服务 管道稀释淤泥施工时应采用专业高压水车将两个检查井注入室内灌水&#xff0c;并使用挖泥机将检查井中的污泥与排污管混合&#xff0c;以稀释污泥为目的. 如果是手工作业应与机械作业配合以不断搅拌污泥&#xff0c;直到将其稀释到水中为止.管道吸污。 公司备…

lock.lock_HibernateCascadeType.LOCK陷阱

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

浅谈面向对象思想下的 C 语言

如何使用OO思维方式面向对象(object Oriented&#xff0c;简称&#xff1a;OO)在于用“找对象”的方式去规划和描述问题。一、怎样“找对象” &#xff08;思维过程&#xff09;“对象”是具有共性的一个群体。以 L298N 控制马达的官方推荐方法为例&#xff0c;控制的共性在于&…

我的世界服务器里怎么无限随机传送,我的世界随机传送插件使用教程 权限指令分享...

导读&#xff1a;在我的世界中玩家可以利用随机传送插件来进行传送人物质与设定点&#xff0c;那么随意传送插件该如何使用呢、下面小编我就来教教各位&#xff0c;我的世界随意传送插件使用教程。什么是RandomLocationRandomLocation让你传送到预设区域的随机位置。可以通过命…

热敏电阻温度特性曲线_NTC热敏电阻如何选型

什么是NTCNTC 热敏电阻是负温度系数的电阻&#xff0c;其特性是电阻值随着温度的升高而呈下降趋势。这个与PTC或者PT100等正温度系数的热敏电阻相反。NTC 热敏电阻NTC的阻值-温度对应曲线如下图所示(100K为例&#xff0c;B值3950)。NTC 热敏电阻R-T曲线下面介绍选型原则。2.根据…

如何使用C语言的面向对象?

我们都知道&#xff0c;C 才是面向对象的语言&#xff0c;但是C语言是否能使用面向对象的功能?(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候&#xff0c;我们需要做…

netflix_学习Netflix管理员–第2部分

netflix为了继续上一篇有关Netflix Governator的一些基础知识的文章&#xff0c;在这里&#xff0c;我将介绍Netflix Governator带给Google Guice的另一项增强功能–生命周期管理 生命周期管理本质上提供了进入对象所经历的不同生命周期阶段的钩子&#xff0c;以引用有关Gover…