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

抽象类(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 关系,它是一种技能。接口是一种多态的方式。

总结

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

相关推荐
2301_7807896610 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设11 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒11 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn12 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川12 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵12 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David12 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10012 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin13 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质13 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring