只有抽象方法的抽象类

3

对于只包含抽象方法的抽象类和接口,它们之间有哪些区别呢?唯一的区别在于接口可以使用多重继承。

在这种情况下,是否使用抽象类还是接口,是否还有其他重要的区别需要考虑呢?


1
我会称之为糟糕的设计 - Luiggi Mendoza
Java 8 还是小于 Java 8? - Boris the Spider
你可以拥有静态方法。 - shmosel
@ismail,你能在Java 8接口中定义构造函数吗? - blafasel
@blafasel 不行,你不能这样做。但更好的设计是拥有一个带有方法的接口和实现该接口的抽象类,该抽象类声明所需的构造函数。这样,接口的实现可以选择直接实现接口或从抽象类继承。 - Luiggi Mendoza
显示剩余2条评论
2个回答

0

声明非公共方法为抽象的能力...将抽象类设置为从其他父类派生并通过此提供父类方法给子类的能力...确定您的构造函数将获取什么数据,从而强制派生类“知道”某些数据的能力。


对于一个只有抽象方法的抽象类和接口,它们之间有什么区别呢?实际上,拥有这种抽象类是一种糟糕的设计:1)如果你从另一个类继承,那么这个抽象类没有任何实际的好处;2)如果你为子类确定构造函数,与接口相比,我认为这更像是一种限制而不是好处;3)自从Java 8以来,在接口中可以有默认方法,这使得你能够为接口中的方法定义行为。 - Luiggi Mendoza

0
抽象类是用来继承的,当一个类继承另一个类时,这意味着这两个类之间存在着强关系。例如,如果我们有一个名为“Canine”的抽象基类,任何派生类都应该是属于Canine家族的动物(像狗或狼)。我们使用“应该”这个词是因为它取决于Java开发人员来确保这种关系的维持。
另一方面,接口本身与实现接口的类之间的关系并不一定强烈。例如,如果我们有一个名为“House”的类,这个类也可以实现一个名为“AirConditioning”的接口。拥有空调并不是房子的必要部分(尽管有些人可能会对此提出异议),而且这种关系没有像“TownHouse”类与“House”类之间的关系或者从“House”类派生的“Apartment”类之间的关系那样强烈。
因为TownHouse是House的一种类型,所以这种关系非常强烈,更适合通过继承来定义,而不是通过接口。
所以,我们可以通过说抽象类与将从中派生的类之间存在强关系来总结这个第一点。再次强调,这是因为抽象类与继承非常密切相关,这意味着存在强关系。但是,使用接口时,接口与实现接口的类之间不需要存在强关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接