接口比抽象类有什么优势?

新手上路,请多包涵

在 Java 中,抽象类提供了定义具体方法和抽象方法的能力,而接口只提供了实现抽象方法的能力。我相信在这两种情况下都可以覆盖子类/实现中的方法,因此,一个相对于另一个的真正优势是什么(Java 中的接口与抽象类)?

原文由 zod 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 436
2 个回答

当您想说“我不在乎您如何做,但这是您需要完成的事情”时,界面就是为您准备的。

抽象类用于当您想说“我知道您应该做什么,并且我知道在某些/许多情况下您应该如何做”时。

抽象类有一些严重的缺点。例如:

 class House {

}

class Boat {

}

class HouseBoat extends /* Uh oh!! */ {
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter
}

可以通过一个接口打通:

 interface Liveable {

}

interface Floatable {

}

class HouseBoat implements Liveable, Floatable {

}

现在,抽象类也很有用。例如,考虑 AbstractCollection 类。它为所有集合定义了非常常见的方法的默认行为,例如 isEmpty()contains(Object) 。如果你愿意,你可以覆盖这些行为,但是……确定集合是否为空的行为真的有可能改变吗?通常它将是 size == 0 。 (但它可以产生很大的不同!有时计算大小的成本很高,但确定某物是否为空就像查看第一个元素一样容易。)

并且由于它不会经常更改,是否真的值得开发人员花时间每次……一次……针对该“已解决”类别中的每个方法实施该方法?更不用说何时需要对其进行更改,如果必须在所有地方重新实现它,就会出现代码重复和遗漏错误。

原文由 corsiKa 发布,翻译遵循 CC BY-SA 4.0 许可协议

接口很有用,因为 Java 没有多重继承(但您可以实现任意多的接口)。

当您需要基类的具体行为时,抽象类很有用。

原文由 Oliver Charlesworth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题