面向对象程序语言中的抽象类与接口的区别

抽象类(Abstract Class)和接口(Interface)都是面向对象编程语言中用于实现抽象性的两种机制。它们有一定的相似之处,但是在使用和作用上有很多重要的区别。以下是抽象类和接口之间的一些主要区别:

定义

抽象类:是一个类,它的功能是提供一个通用的抽象层,以便子类可以基于它来扩展和实现。抽象类不能被实例化,它只能被继承。抽象类可以包含抽象方法和非抽象方法。抽象类的子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。

抽象方法定义了一些通用的行为。抽象方法必须在子类中实现。抽象方法不能被声明为 private,否则子类将无法访问它。抽象类是可以有构造方法的,但是不能被实例化。

以 Java 语言为例,java.lang.Object 是所有类的超类,它是一个抽象类,它的定义如下:

java 复制代码
public abstract class Object {
    ...
}

接口:是一个完全抽象的类,它只包含抽象方法和常量。接口不能被实例化,它只能被实现。接口的实现类必须实现接口中的所有抽象方法,否则实现类也必须声明为抽象类。

接口中的抽象方法定义了一些通用的行为的规格,但是没有具体的实现。接口中的抽象方法不能被声明为 private,否则实现类将无法访问它。接口不能有构造方法。

以 Java 语言为例,java.lang.Cloneable 是一个接口,它的定义如下:

java 复制代码
public interface Cloneable {
    ...
}

使用

抽象类 :子类使用抽象类通过 extends 关键字进行继承。一个类只能继承一个抽象类。

接口 :子类使用接口通过 implements 关键字进行实现。一个类可以实现多个接口。

设计

抽象类:抽象类是一种自下而上的设计方式。抽象类是从子类中抽象出来的,它包含了子类的通用行为。抽象类是一种 is-a 关系,它是一种本质。抽象类是一种代码复用的方式。

接口:接口是一种自上而下的设计方式。接口是从子类中抽象出来的,它包含了子类的通用行为的规格。接口是一种 has-a 关系,它是一种技能。接口是一种多态的方式。

总结

子类可以实现多个接口,但是只能继承一个抽象类。打个比方,抽象类就像是一个人,而接口就像是一个人的技能。一个人可以有多个技能,但是一个人只能有一个本质。如果从数据库的角度来看,抽象类就像是一个表,而接口就像是一个视图。一个表可以有多个视图,但是一个视图只能对应一个表。

相关推荐
2601_962071574 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491115 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
东风破_6 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
zww89491117 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
行百里er7 小时前
Gateway 上别硬塞 MVC:DeferredImportSelector 看菜下锅
spring boot·后端·开源
名字还没想好☜8 小时前
Java 遍历时删元素抛 ConcurrentModificationException:fail-fast 原理与三种正确删法
后端
IT_陈寒8 小时前
React Hooks闭包陷阱差点让我加班到凌晨
前端·人工智能·后端
黑马程序员毕设8 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳8 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
码事漫谈9 小时前
本体论,彻底懂
后端