Discuss / Java / 接口有了default方法跟抽象类的区别很小了

接口有了default方法跟抽象类的区别很小了

Topic source

Java设计者可能是感觉多继承太复杂,所以废弃了C++的多继承,设计成了单继承,这常常也被说成是其优点。但单继承又不能满足实际需求,就增加了接口概念,它其实是抽象类的精简版。Java8之前将抽象类去掉实例字段,实例实现方法,就成了接口。Java8又给接口加回了实例实现方法(换了个名字叫default方法),这样,接口跟抽象类之间只剩下一层薄薄的外衣了(实例字段)。感觉绕了多年,最后还是走了多继承的路啊,而且多了几个概念。还不如一开始就使用多继承简单。

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

default方法主要目的是怕接口增加新方法实现类挂了

比如jdbc接口升级了,老驱动就会挂,有default方法就可以给老版本续命

恩恩,这么做我理解。我想说的是Java8之后,抽象类与接口已经基本没区别了,唯一的区别是接口不能定义实例字段。感觉Java语言设计之初,对增加接口考虑的不全面,本来是想搞个抽象类的精简版,但后面又发现不行,又往里加东西,现在这两者其实没多少区别了。还不如在一开始就别增加接口这个概念,就让Java支持多继承,就像Python那样,我个人感觉挺好的。我理解Java的接口对应Python的Mixin类(我叫它插件类)。就我所知,Java接口承担两个作用:

1. Mixin类,支持多继承(即implements多个接口)

2. 实现函数,即函数接口

对比Java和Python,Python没增加接口这个概念,而是支持多继承;另外Python定义了函数概念。

Python的多继承灵活性高些,但对开发者也有要求,如果开发者定义类使用了多继承,但不是Mixin模式,那类可读性会比较差,相当于类有多个主干,有点乱。Java的继承树强制要求有主干,有插件,结构更清晰简单,在语言层面解决了一个类有多个主干的问题。不过接口类设计的跟抽象类太像了,又有点不伦不类。

对比两者,我更喜欢Python的实现方式。一家之言

实例实现方法  是什么????


  • 1

Reply