注解默认继承

最近卢卡斯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

注解默认继承

注解默认继承_默认方法和多重继承相关推荐

  1. gdb 扩展 默认参数_默认方法一种扩展旧代码的方法

    gdb 扩展 默认参数 如您所知,Java的新版本已于2014年3月18日发布,我将介绍一系列文章来演示其新功能,也许在某些方面,我将谈论我的想法和批评. 我认为重要的第一个功能是"默认方法 ...

  2. oracle中_给表中的字段入学时间添加一个默认约束_默认系统时间,oracle常用语句,带详细的说明...

    /*作用:创建表空间 用来保存用户的操作   说明:oracleDemo文件夹必需存在  默认的大小10M 超过10M时会以1M为增长大小  最大不能超过100M*/ create tablespac ...

  3. 【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默认混淆结果 | 保留类及成员混淆结果 | 保留注解以及被注解修饰的类/成员/方法 )

    文章目录 一.Proguard 默认混淆结果 二.Proguard 保留类及成员混淆结果 三.Proguard 保留注解以及被注解修饰的类/成员/方法 更多 ProGuard 混淆配置参考 : htt ...

  4. MySQL如何修改表的储存方式_修改mysql默认存储引擎的方法

    修改mysql默认存储引擎的方法,供大家学习参考. 先来了解一下mysql存储引擎: mysql服务器采用了模块化风格,各部分之间保持相对独立,尤其体现在存储架构上.存储引擎负责管理数据存储,以及my ...

  5. java设置默认参数_关于java:如何设置默认方法参数值?

    本问题已经有最佳答案,请猛点这里访问. 是否可以在Java中设置默认的方法参数值? 例子:如果有方法 public int doSomething(int arg1, int arg2) { //so ...

  6. chrome浏览器打开网页默认全屏的方法_测试成功

    chrome浏览器打开网页默认全屏的方法 1.在桌面上右键创建快捷方式 2.在地址栏中输入: "C:\Program Files (x86)\Google\Chrome\Applicatio ...

  7. python登录系统账号检测_一种基于python的惠普打印机默认用户名密码检测方法与流程...

    本发明涉及打印机检测技术领域,特别是一种基于python的惠普打印机默认用户名密码检测方法. 背景技术: 网络打印机是当前各大中小型企业正常办公比不可少的办公网络设备,但对于大中型企业而言,不同部门或 ...

  8. 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener

    2019独角兽企业重金招聘Python工程师标准>>> 使用RunWith注解改变JUnit的默认执行类,并实现自已的Listener在平时的单元测试,如果不使用RunWith注解, ...

  9. java的注解方式_详解Java注解的实现与使用方法

    详解Java注解的实现与使用方法 Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性.在如今各种框架及开发中非常常见,特此说明一下. 如何创建一个注解 每一个自定义的注解都由四 ...

最新文章

  1. Java-学习笔记-1-概述
  2. Interview:算法岗位面试—上海某公司算法岗位技术(偏机器学习,证券基金行业)面试考点之进程与线程区别、GD改进的算法、ROC和AUC
  3. 霍金一生重要时刻照片合集,3次来中国,年轻时也是帅哥一枚
  4. opencv python教程简书_Python-OpenCV —— 基本操作一网打尽
  5. Devoxx 2011印象
  6. [导入]一再的变故,终于决定何去何从.
  7. mysql 运行 compile_install mysql by compile(通过编译安装mysql)
  8. 不能连接到 mysql_怎么无法连接到数据库?
  9. Caffe学习 五 conv_layer与im2col
  10. 传统的web项目(含有webroot文件夹)导入IDEA需要做的一系列配置
  11. Python美化桌面—自制桌面宠物
  12. 【MATLAB】求解矩阵方程
  13. 【常用传感器】LCD1602液晶工作原理详解及例程代码
  14. 常用计算机高级语言及其特点,计算机高级语言特点是什么?常见的语种有哪些?...
  15. 在PB中如何打开一个非執行文件
  16. python等比例压缩图片_python图片等比例压缩
  17. 0626第一篇博客CSDN我就是那个学编程的女神。。经病!
  18. 基于SpringBoot旅游信息管理系统
  19. ip地址测试软件,服务器ip链接测试软件
  20. RT-Thread记录(十、全面认识 RT-Thread I/O 设备模型)

热门文章

  1. CF1119H-Triple【FWT】
  2. P1196 ssl1225-银河英雄传说【图论,并查集】
  3. 【线段树】开关(luogu 3870)
  4. 纪中C组模拟赛总结(2019.7.5)
  5. HDU6223 - Infinite Fraction Path
  6. P2522 HAOI2011 Problem b [莫比乌斯反演,数论分块]
  7. 深入理解分布式系统中的缓存架构(下)
  8. HashMap jdk1.7源码阅读与解析
  9. 如何实现省市关联的下拉列表
  10. 2020蓝桥杯省赛---java---A---7(回文日期)