接口和抽象类的区别 抽象类和普通类区别

2025-01-2107:50:18常识分享0

在Java开发中,我们经常听到并使用“面向接口编程”的理念。开发过程中,为service层的每个方法编写接口以及在DAO层使用Mapper接口是常见的做法,随后交给MyBatis框架处理。除了这些广泛使用的接口,还有一种与接口相似的概念——“抽象类”,不知大家是否还记得。今天,让我们来探讨下接口和抽象类的那些事儿。

接口与抽象类,如同孪生兄弟般存在。在某些方面,它们似乎可以互换使用。从定义上来看,它们之间有着明显的区别。

接口可以理解为定义了一组标准或操作流程。在Java的API中,我们可以看到如AutoCloseable接口的例子。这个接口仅定义了一个close()方法,并抛出Exception异常。通过查看该接口的注释,我们可以了解其含义。与java.io.Closeable接口相比,AutoCloseable接口的close()方法不要求幂等性,同时建议实现类或接口定义自己的close()方法。

在Java中,一个有趣的特性是接口可以继承其他接口。例如,Closeable接口继承了AutoCloseale接口,并拥有自己的close()方法,该方法抛出的是IOException异常,表明该接口与IO操作相关。

谈及接口与抽象类的比较时,我们不妨以java.lang.AutoCloseable和java.io.Closeable这两个接口为例。尽管它们都只有close()方法,但前者更像是一个高度抽象的规范,仅描述了关闭资源的动作并抛出Exception异常。而后者则更具体地与IO操作相关联。

让我们将目光转向一个具体的实现类——InputStream。虽然它不是一个接口而是一个抽象类,但它实现了Closeable接口。从抽象类中我们可以看到其他一些如read()、skip()、avaliable()等非抽象方法。值得注意的是,抽象类中可以有非抽象方法的存在。

当我们回头看InputStream类中的read()方法时,会发现有些方法是抽象的而有些则有具体实现。这再次强调了抽象类与接口之间的差异。

通过以上诸多实例和解释,我们旨在为大家对接口和抽象类提供一个直观的认识。总结一下,接口定义了一组规范或功能,并可以实现其他接口。在Java中,一个方法是抽象的就意味着其所在的类也是抽象的。java8开始接还可以有default修饰的方法。

对于何时使用接口或抽象类的问题,我认为需要根据具体场景来决定。对于高度抽象、通用的功能或协议,应使用接口来定义;而对于某些不涉及所有类的行为或实现部分功能供子类覆盖的情况,可以考虑使用抽象类。需要注意的是接口和抽象类各有其特点和适用场景。

本文旨在探讨接口和抽象类的使用和区别。这些基础概念虽然常见但容易被忽视。如有不当之处,敬请指正。