抽象类与界面的区别是面试中的热门问题之一。抽象类和接口是Java编程语言的核心部分。选择接口还是抽象类是每个架构师都要面对的设计决策。在我的上一篇文章中,我已经提供了关于Java interface和**抽象class** .]的尽可能多的细节在这篇文章中,我们将了解抽象类和接口之间的区别,以及何时应该使用接口而不是抽象类,反之亦然。
抽象类与接口的区别
1.abstract
关键字用于创建抽象类,也可以与方法一起使用;interface
关键字用于创建接口,不能与方法一起使用。
2.子类使用extends
关键字来扩展抽象类,需要提供抽象类中所有声明的方法的实现,除非子类也是抽象类,而子类使用Implements
关键字来实现接口,并且应该为接口中声明的所有方法提供实现。
3.抽象类可以有方法和实现,而接口提供绝对抽象,不能有任何方法实现。请注意,从Java 8开始,我们可以在包含方法实现的接口中创建默认和静态方法。
4.抽象类可以有构造函数,但接口不能有构造函数。
5.抽象类拥有普通Java类的所有功能,只是我们不能实例化它。我们可以使用abstract
关键字来使类成为抽象的,但是接口是完全不同的类型,并且只能有公共的静态最终常量和方法声明。
6.抽象类方法可以有PUBLIC、PRIVATE、PROTECTED、STATIC等访问修饰符,但接口方法是隐式公共的、抽象的,不能对接口方法使用其他访问修饰符。
7.一个子类只能扩展一个抽象类,但可以实现多个接口。
8.抽象类可以扩展其他类实现接口,但接口只能扩展其他接口。
9.如果抽象类有main()
方法,我们可以运行它,但我们不能运行接口,因为它们不能有main方法实现。
10.接口用于定义子类的契约,抽象类也定义契约,但它可以提供其他方法实现供子类使用。
这就是接口和抽象类之间的_区别 _,现在我们可以继续了解什么时候应该使用接口而不是抽象类,反之亦然。
接口或抽象类
为子类提供约定是在接口类还是抽象类之间进行选择,这是一个设计决策,取决于许多因素。让我们来看看什么时候接口是最佳选择,什么时候我们可以使用抽象类。
- Java不支持多类继承,所以每个类只能继承一个超类。但是一个类可以实现多个接口。因此,大多数时候,接口是为类层次结构和契约提供基础的好选择。另外,根据接口进行编码是java编码的最佳实践之一。 2.如果合约中有很多方法,那么抽象类更有用,因为我们可以为所有子类通用的一些方法提供默认实现。同样,如果子类不需要实现特定的方法,它们可以避免提供实现,但在接口的情况下,子类必须提供所有方法的实现,即使它没有用,实现只是空块。 3.如果我们的基合约不断变化,那么接口可能会导致问题,因为我们不能在不改变所有实现类的情况下向接口声明额外的方法,而抽象类可以提供默认实现,只改变实际上要使用新方法的实现类。
同时使用抽象类和接口
同时使用接口和抽象类是设计系统的最佳方法。例如,在JDK中java.util.List
是一个包含很多方法的接口,所以有一个抽象类java.util.AbstractList
,它为List接口的所有方法提供了一个骨架实现,使得任何子类都可以扩展这个类,只实现需要的方法。我们应该始终从接口作为基础开始,并定义每个子类都应该实现的方法,然后如果有一些方法只有特定的子类才应该实现,我们可以扩展基接口并使用这些方法创建一个新的接口。子类将可以根据其要求在基接口或子接口之间进行选择以实现。如果方法的数量增加了很多,那么提供一个框架抽象类来实现子接口并为子类提供在接口和抽象类之间进行选择的灵活性并不是一个坏主意。
Java 8接口更改
从Java 8开始,我们可以在接口中实现方法。我们可以在接口中创建默认方法和静态方法,并为它们提供实现。这已经弥合了抽象类和接口之间的鸿沟,现在接口是可行的,因为我们可以通过为新方法提供默认实现来进一步扩展它。有关更多详细信息,请查看JAVA 8接口默认静态methods.