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

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

总结

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

相关推荐
星辰烈龙4 分钟前
黑马程序员Java基础9
java·开发语言
山沐与山5 分钟前
【Redis】Redis集群模式架构详解
java·redis·架构
ss27316 分钟前
Java并发编程:DelayQueue延迟订单系统
java·python·算法
SHERlocked9318 分钟前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
wcy_101121 分钟前
七大软件设计原则
java·设计规范
invicinble22 分钟前
jar包在执行的时候需要关注的细节(提供一个解构jvm问题的视角)
java·jvm·jar
麦芽糖021924 分钟前
SSE介绍及使用(Server-Send Events)
java
alan072128 分钟前
【Java + Elasticsearch全量 & 增量同步实战】
java·elasticsearch·jenkins
AutoMQ39 分钟前
How does AutoMQ implement a sub-10ms latency Diskless Kafka?
后端·架构
Rover.x41 分钟前
Netty基于SpringBoot实现WebSocket
spring boot·后端·websocket