关于抽象类与接口

2020-06-14 17:16:08 +08:00
 zxc1234

我的理解是:

抽象类是 is-a,接口是 has a,java 可以多继承,但是只能实现一个接口

一般在项目中如果多个类都有用到共同的方法( A ),并且不同类这个方法( A )的实现不同,我会抽象出一个抽象类

然后多个子类继承它,子类各自重写这个方法的逻辑(好像这边也可以用接口实现???)

当这些子类有共同的方法实现( B ),只能用抽象类,因为接口不能有方法实现。

但是 java8 支持接口方法实现,那么是不是除了类可以多继承,接口只能实现一个这个区别外

接口可以完全代替抽象类了?

谢谢~

2022 次点击
所在节点    程序员
11 条回复
mreasonyang
2020-06-14 17:24:33 +08:00
并不能完全替代抽象类啊,比如接口里搞定不了非静态属性,访问控制也没有。而且 default 方法的出现个人觉得更多的考虑是对接口功能的扩展而不是用来替代抽象类的。
zhazi
2020-06-14 17:30:43 +08:00
可以多继承吗?只能实现一个接口吗?
zsdroid
2020-06-14 17:44:54 +08:00
多继承单实现??我学了个假的 java 。
Uchiha0bito
2020-06-14 17:45:04 +08:00
意义上还是有区别 一个强调继承 一个强调拓展功能
DoodleSit
2020-06-14 17:59:49 +08:00
我学的是个假 java 。。。
namelosw
2020-06-14 18:01:46 +08:00
用了 Scala 你就知道,这俩没区别. Scala 的 trait 该有的功能全有,就差个 constructor 今年 Scala 3 会加上.

看起来有区别是因为 Java 实现的功能太少. 尝试跟你解释继承组合有区别的人都是基于 Java 实现,多大鞋多大脚自动脑补的...

除了 Scala 像常见的 Python 也很少区分. 继承组合都可以用多继承流畅表达.
guangdao
2020-06-14 18:29:54 +08:00
多继承单实现...兄弟学的怕不是 avaj 吧((
hippieZhou
2020-06-14 18:55:54 +08:00
你可以这样理解:抽象类再抽象也是类,所以它规定了继承它的实例是什么,但接口是对行为的抽象,规定了继承它的实例能干什么;所以抽象类描述是什么,接口描述能干什么,:)
zxc1234
2020-06-15 07:55:47 +08:00
@zhazi
@guangdao
@zsdroid
@DoodleSit

我错了,单继承多实现
jinzhongyuan
2020-06-15 09:41:28 +08:00
这个问题 得 从 功能 和 语义 俩方面 来想
Jafee
2020-06-15 10:09:29 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681463

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX