JDK 8时代的抽象类与接口

在新的Java 8日期和时间API:Stephen Colebourne的访谈中 , Stephen Colebourne告诉Hartmut Schlosser :“我认为最重要的语言更改不是lambda,而是接口上的静态方法和默认方法。” Colebourne补充说:“添加默认方法消除了使用抽象类的许多原因。” 在阅读本文时,我意识到Colebourne是正确的,并且我当前使用抽象类的许多情况都可以用具有JDK 8默认方法的接口替换。 这在Java世界中非常重要,因为抽象类和接口之间的差异一直是困扰新Java开发人员试图理解差异的问题之一。 在许多方面,在JDK 8中区分两者甚至更加困难。
在线论坛和博客中有许多示例,讨论了Java接口和抽象类之间的区别。 这些包括但不限于JavaWorld的Abstract类和interfaces , StackOverflow的何时必须使用接口代替抽象类? , 接口与抽象类之间的区别 ,Java中的10个抽象类和接口面试问题 ,曾经有用且有用的答案,现在它们中的许多已经过时了,对于那些刚开始使用Java的Java初学者来说,这可能会更加困惑JDK 8的Java经验。

当我在思考JDK 8世界中Java接口和抽象类之间的其余差异时,我决定看看Java教程对此要说些什么。 本教程已更新为反映JDK 8,并且抽象方法和类具有称为“与接口相比的抽象类”的部分,该部分已进行了更新以合并JDK8。本节指出了JDK 8接口与抽象类的异同。 。 它强调的区别是数据成员和方法的可访问性:抽象类允许非静态和非最终字段,并允许方法是公共的,私有的或受保护的,而接口的字段本质上是公共的,静态的和最终的,以及所有接口方法本质上是公共的。

Java教程继续列出了何时应该考虑抽象类以及何时应该考虑接口的项目符号。 毫不奇怪,它们源自前面提到的差异,并且主要与是否需要将字段和方法设置为私有,受保护,非静态或最终(喜欢抽象类)或是否需要专注于键入的能力有关无需考虑实现(偏好接口)。

因为Java允许一个类实现多个接口但仅扩展一个类,所以当特定实现需要与多种类型关联时,可以认为该接口是有利的。 由于JDK 8的默认方法,这些接口甚至可以为实现提供默认行为。

一个自然的问题可能是:“ Java如何处理实现两个接口的类,这两个接口都描述具有相同签名的默认方法?” 答案是这是编译错误。 这在下一个屏幕快照中显示,该快照显示NetBeans 8在我的类实现两个接口时均报告该错误,每个接口定义了具有相同签名[ String speak() ]的默认方法。

netBeans8CompilerErrorMultipleInterfacesSameDefaultMethodSignatures

如上面的屏幕快照所示,显示了一个编译器错误,指出“类...从类型…和…继承…的不相关默认值”(其中,类名,默认方法名和两个接口名是消息中指定的名称) )。 Peter Verhas撰写了一篇详细的文章(“ Java 8默认方法:可以做什么和不能做什么? ”),探讨了与带有相同方法的具有默认方法名称的多重实现接口相关的一些极端情况(陷阱)。

结论

可以说,JDK 8带来了抽象类相对于接口的最大优势。 这样做的含义是,当今使用的大量抽象类很可能会被具有默认方法的接口所取代,而许多将来将成为抽象类的未来构造现在将成为具有默认方法的接口。

翻译自: https://www.javacodegeeks.com/2014/04/abstract-class-versus-interface-in-the-jdk-8-era.html

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

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

相关文章

ajax请求拿到多条数据拼接显示在页面中

首先我们拿到的了一坨Json数据 如下 然后通过ajax请求拿到数据 在ajax的success方法中处理和使用数据: 其中包括: 用eval处理这种数据 var outStr eval(( data.data )); 用循环取出数据并使用 $.each(outStr,function(index){ console.log(outStr[i…

在IntelliJ IDEA中为不同的数据源着色

IntelliJ IDEA中的数据库插件是使用数据库中数据的有用工具。 只要我们有了JDBC驱动程序来连接数据库,就可以配置数据源。 然后,我们可以运行查询,检查表的内容并使用数据库工具窗口更改数据。 具有多个数据源(例如开发和测试环境…

[蓝桥杯]ALGO-185.算法训练_Trash Removal

题目描述&#xff1a; 代码如下&#xff1a; 1 #include <algorithm>2 #include <cstdio>3 #include <cstdlib>4 #include <cmath>5 #include <cstring>6 #include <iostream>7 #define INF 0x7fffffff8 using namespace std;9 10 typed…

从客户端...中检测到有潜在危险的 Request.Form 值

在.net中&#xff0c;Request时出现有HTML、Javascript等字符串时&#xff0c;系统会认为是危险值&#xff0c;运行显示“从客户端……中检测到有潜在危险的Request.Form值”这样的错。解决办法&#xff1a; &#xff08;1&#xff09; 在.aspx文件头中加入这句&#xff1a; …

android 之 百度地图

简介 百度地图Android定位SDK为基于移动客户端开发LBS应用提供基础定位能力。 功能介绍 功能介绍&#xff1a; 地图展示&#xff1a;包括2D图、卫星图、3D图地图展示。 地图操作&#xff1a;提供控制平移、缩放、底图旋转、变换视角等地图相关操作的功能。 短串分享&#xff1a…

从javaagent迁移到JVMTI:我们的经验

当您需要从JVM内部收集数据时&#xff0c;您会发现自己很危险地接近Java虚拟机内部进行工作。 幸运的是&#xff0c;有一些方法可以避免被JVM实现细节所困扰。 Java之父没有给您提供过两个漂亮的工具供您使用。 在这篇文章中&#xff0c;我们将说明两种方法之间的差异&#xf…

HTML--HTML对象的关于位置和大小的属性的图解

转载于:https://www.cnblogs.com/duadu/archive/2007/08/08/6166687.html

flower.php,flower.php

session_start();//定义个常量&#xff0c;用来授权调用includes里面的文件define(IN_TG,flower);define(IN_JS,flower);//定义个常量&#xff0c;用来指定本页的内容define(SCRIPT,message);//引入公共文件require dirname(__FILE__)./includes/common.inc.php;//判断是否登录…

BABOK - 需求管理和沟通(Requirements Management and Communication)概要

本文更新版本已挪至 http://www.zhoujingen.cn/itbang/345.html ------------------------------------------- 描述 需求管理和沟通描述我们如何管理冲突、问题、变更&#xff0c;并确保涉众和项目团队在方案范围内保持一致。不同项目的复杂度和方法论支持都不一样&#xff0c…

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

什么是默认方法 在Java 8发行版中&#xff0c;您可以修改接口以添加新方法&#xff0c;以便该接口与实现该接口的类保持兼容。 如果您要开发一个库&#xff0c;该库将由基辅到纽约的几位程序员使用&#xff0c;那么这非常重要。 在Java 8出现之前&#xff0c;如果您在库中发布了…

P1047 校门外的树

P1047 题目描述 某校大门外长度为L的马路上有一排树&#xff0c;每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴&#xff0c;马路的一端在数轴0的位置&#xff0c;另一端在L的位置&#xff1b;数轴上的每个整数点&#xff0c;即0,1,2,…,L&#xff0c;都种有一棵…

.Net Core Swagger:Actions require an explicit HttpMethod binding for Swagger 2.0

添加完Swagger包引用后运行报错&#xff1a;Actions require an explicit HttpMethod binding for Swagger 2.0 第一时间想到了父类控制器 没有添加 [HttpPost] 之类的特性 添加后就可以解决这个报错原因 但是我的父类控制器里的两个方法只是为了做返回值的一些处理&#xff0c…

matlab impdt,实验1 基于Matlab的数字信号处理基本操作

图1-7 离散时间信号的基本运算及波形图>>title(x2(n)),axis([-15 15 0 1]) >>subplot(413)>>stem(n3,x,fill),grid on >>title(x3(n)),axis([-15 15 0 1]) >>subplot(414)>>stem(n4,x,fill),grid on >>title(x4(n)),axis([-15 15 0 …

画函数图形的C#程序(改进版) (转)

我在10月份发表过一篇随笔“画函数图形的C#程序&#xff0c;兼论一个病态函数”&#xff0c;在那篇随笔中写道&#xff1a; 这个画函数图形的C#程序有一个严重的缺点&#xff0c;就是函数表达式是直接写的源程序中的&#xff0c;不能象SciLab和Matlab那样交互式地输入。 后来&a…

Swift-UITextView占位文字及占位文字颜色扩展(可在xib中直接使用)

使用案例 extension UITextView {private struct RuntimeKey {static let hw_placeholderLabelKey UnsafeRawPointer.init(bitPattern: "hw_placeholderLabelKey".hashValue)/// ...其他Key声明}/// 占位文字IBInspectable public var placeholder: String {get {re…

Java 8中Lambda表达式的阴暗面

这篇文章可能不会使我成为任何新朋友。 哦&#xff0c;好吧&#xff0c;无论如何我从来没有真正在学校受到欢迎。 但是&#xff0c;让我们说清楚。 就语言而言&#xff0c;Java 8的最大特色无疑是Lambda表达式。 几年来&#xff0c;它一直是功能语言&#xff08;例如Scala和Clo…

JQ实现弹幕效果

JQ实现弹幕效果&#xff0c;快来吐糟你的想法吧 效果图&#xff1a; 代码如下&#xff0c;复制即可使用&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>JQ实现弹幕效果</title><style type"t…

获取表的所有列名

selectname fromsyscolumns whereidobject_id(表名)下面这样也可以:selectcolumn_name frominformation_schema.columns wheretable_name news转载于:https://www.cnblogs.com/zhuboxingzbx/archive/2007/09/03/880049.html

天下武功唯快不破------实验吧

题目地址&#xff1a;http://www.shiyanbar.com/ctf/1854 打开链接 全是英文&#xff0c;能力有限&#xff0c;翻译一下&#xff0c;好像没其他东西了&#xff0c;查看一下源码 让用post请求&#xff0c;丢到burp改一下 看到response有一个FLAG: UDBTVF9USElTX1QwX0NINE5HRV9GT…

JS实现文本中查找并替换字符

JS实现文本中查找并替换字符 效果图&#xff1a; 代码如下&#xff0c;复制即可使用&#xff1a; <!DOCTYPE html><html> <head><style type"text/css">*{font-family:"微软雅黑";font-size:16px;margin:0;padding:0;letter-spaci…