在 Java 中,抽象类提供了定义具体方法和抽象方法的能力,而接口只提供了实现抽象方法的能力。我相信在这两种情况下都可以覆盖子类/实现中的方法,因此,一个相对于另一个的真正优势是什么(Java 中的接口与抽象类)?
原文由 zod 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Java 中,抽象类提供了定义具体方法和抽象方法的能力,而接口只提供了实现抽象方法的能力。我相信在这两种情况下都可以覆盖子类/实现中的方法,因此,一个相对于另一个的真正优势是什么(Java 中的接口与抽象类)?
原文由 zod 发布,翻译遵循 CC BY-SA 4.0 许可协议
接口很有用,因为 Java 没有多重继承(但您可以实现任意多的接口)。
当您需要基类的具体行为时,抽象类很有用。
原文由 Oliver Charlesworth 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
当您想说“我不在乎您如何做,但这是您需要完成的事情”时,界面就是为您准备的。
抽象类用于当您想说“我知道您应该做什么,并且我知道在某些/许多情况下您应该如何做”时。
抽象类有一些严重的缺点。例如:
可以通过一个接口打通:
现在,抽象类也很有用。例如,考虑 AbstractCollection 类。它为所有集合定义了非常常见的方法的默认行为,例如
isEmpty()
和contains(Object)
。如果你愿意,你可以覆盖这些行为,但是……确定集合是否为空的行为真的有可能改变吗?通常它将是size == 0
。 (但它可以产生很大的不同!有时计算大小的成本很高,但确定某物是否为空就像查看第一个元素一样容易。)并且由于它不会经常更改,是否真的值得开发人员花时间每次……一次……针对该“已解决”类别中的每个方法实施该方法?更不用说何时需要对其进行更改,如果必须在所有地方重新实现它,就会出现代码重复和遗漏错误。