java8新特性 接口和抽象类

sunstubble 2017-06-09 10:18:17
java8增加了新特性 接口可以使用默认的方法和静态的方法,这进一步增加了接口的适用性,网上基本只是比较了定义接口和抽象类的不同,没有实例,有大神能说说现在接口有默认方法了为什么还需要去用抽象类吗?,能举实例最好(is-a,like-a别说的这么抽象....) 谢谢了
...全文
291 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunstubble 2017-06-12
  • 打赏
  • 举报
回复
结帖了吧 谢谢二位了
sunstubble 2017-06-09
  • 打赏
  • 举报
回复
如果是这样我为什么还需要去使用抽象类去继承呢?用接口不是更加方便 貌似java本来就不鼓励去继承
sunstubble 2017-06-09
  • 打赏
  • 举报
回复
谢谢版主大大回复了 这样说吧抽象类和接口的定义什么的都能够理解关键是现在到编写代码的本质问题上 现在接口能实现默认方法了变向可以复用代码了 唯一可以想到的是用接口的话会有强制的约束像2L大兄弟说的那样你必须去实现接口中的抽象方法否则这个类继续抽象 除了这点实质上在编码功能上还有什么区别呢? 感觉现在接口和抽象类抛开定义的话 抽象类能实现的东西接口也能实现 只是简单的一个标识符了
正怒月神 2017-06-09
  • 打赏
  • 举报
回复
而接口的default最多只是帮你提供了一个默认的实现。 但是并不是说他能影响接口的本质。 我个人觉得其实接口的default是具有破坏性的。 因为按照我的逻辑,应该有一个抽象类来实现接口。然后从抽象类派生出不同的基类,选择性的Override方法
正怒月神 2017-06-09
  • 打赏
  • 举报
回复
大兄弟,接口和抽象类,侧重点不同。 简单说,抽象类是父类,是一个祖宗。 接口是一部分行为。可以是吃饭,抽烟,喝酒等等。 举个简单的例子。 比如这里有 抽象类 鸟; 鸟应该有翅膀,有足。 这都是抽象类的东西。 但不是所有的鸟,都会飞。家鸡,企鹅就不会(鸭嘴兽算不算鸟,我不清楚,反正也不会飞) 而飞这种行为就会作为一个接口。 鸟这个抽象类下面,可能会衍化2个派生类,会飞的鸟类和不会飞的鸟类。各自继承不同的接口。 最后总结一下。 抽象类是对于物体的大致描述。 接口是对物体行为的零散定义。(比如前面说的飞接口,完全可以给飞机,火箭来实现。)
sunstubble 2017-06-09
  • 打赏
  • 举报
回复
很感谢 是否可以理解为到了JDK8 中接口也能实现代码的复用(能实现默认代码) 接口和抽象类现在更像是一个标志 来区分实际的用处
HinanaiTenshi 2017-06-09
  • 打赏
  • 举报
回复
引用 2 楼 sunstubble 的回复:
谢谢1L的朋友例子是举的很生动的,可是你也说了 "如果你设计一个api给他人或者的其他程序使用,需要制定使用规范的时候定义接口,需要提高代码复用的时候定义抽象类。" 这句话中在1.7JDK中很好理解 可是现在1.8允许了接口有默认方法不是也变向的可以共用了吗? 我也看了你下面说的添加这个的意义可是在本质上现在接口不是也可以复用代码了吗?
两者的关键差别不在于能做什么,而在于为了什么去做。 接口的根本是做约束,比如两个两个团队对接,两个公司对接,团队内部不同模块的对接,相互之间的api一定是接口。 接口的目的就是定义调用的标准,因为只有接口有强约束,强稳定性,与实现无关的特点。 抽象类的根本是复用,通常是出现在一个高度内聚的模块内部,只以复用为目的出现,并不能起到约束的作用。 举个例子,jdk的api里有大量的接口,稍微用过几天的人都很熟悉,比如List,Map这种,它们是jdk对集合定义的标准与约束,甚至ArrayList这种实现类在继承抽象类的同时,会再次强调自己实现了List接口(从语法上说无此必要)。 至于jdk内部的抽象方法,绝大多数都是不面向外部的。类似guava或者jdbc实现的也是这些接口,而很少会去继承一些jdk的抽象类。 从java8开始两者在语法意义上有一定程度的贴近,但是使用的场景一直以来都是截然不同的。
sunstubble 2017-06-09
  • 打赏
  • 举报
回复
谢谢1L的朋友例子是举的很生动的,可是你也说了 "如果你设计一个api给他人或者的其他程序使用,需要制定使用规范的时候定义接口,需要提高代码复用的时候定义抽象类。" 这句话中在1.7JDK中很好理解 可是现在1.8允许了接口有默认方法不是也变向的可以共用了吗? 我也看了你下面说的添加这个的意义可是在本质上现在接口不是也可以复用代码了吗?
HinanaiTenshi 2017-06-09
  • 打赏
  • 举报
回复
定义接口是为了约束实现,就像交通法规;定义抽象类是为了共用实现,就像共享单车。 这是两者在目的和作用上的根本区别。 如果你设计一个api给他人或者的其他程序使用,需要制定使用规范的时候定义接口,需要提高代码复用的时候定义抽象类。 接口默认方法的初衷是解决接口之间继承,以及某个类实现多个接口但不关注全部约束时带来的重复编码问题。 当一个约束在多数场景下都是相同实现的时候,接口就可以把这个方法作为接口的默认方法。比如接口 i_交规 有方法 灯亮(颜色),它的大多数实现内容都是 灯亮(颜色){if 红 this.停() else ...},它就能作为默认方法,省去大量实现类里的重复编码,只有当救护车这种关注这个方法的子类,才需要去做个性的实现。

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧