抽象类是用来捕捉子类的通用特性的,描述的是一种事物,它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。
抽象类是对整个类进行抽象,包括属性,行为,而接口是对类局部(行为)进行抽象。
举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是会飞。那么在设计的时候,可以将客机设计为一个类Aircraft,将鸟设计为一个类Bird,但是不能将飞行这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将飞行设计为一个接口Fly,包括方法fly(),Aircraft和Bird分别根据自己的需要实现Fly这个接口。至于有不同种类的飞机,可以继承自一个飞机类,不同种类的鸟,可以继承自飞行动物这一类。
代码实现如下:
Fly接口:
Animals的抽象类:
飞机的抽象类:
继承自Animals类,实现Fly接口的Bird:
继承自Plane类,实现Fly接口的Aircraft类:
根据实践,总结抽象类和接口的区别如下:
参数 | 抽象类 | 接口 |
默认的实现方法 | 可以有默认的方法实现 | 接口完全是抽象的,不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它必须提供抽象类里面的所有声明的抽象方法的实现。非抽象方法则不是必须实现 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常Java类的区别 | 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public,不可以使用其他修饰符 |
main方法 | 抽象类可以有main方法并且可以运行 | 接口没有main方法 |
多继承 | 抽象类可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其他接口 |
速度 | 它比接口速度要快 | 接口稍微有点慢,因为它需要时间去寻找在类中实现的方法 |
添加新方法 | 如果往抽象类里面添加新的方法,可以给它提供默认的实现,因此不需要改变现有的代码。 | 如果在接口中添加方法,那么必须改变实现该方法的类。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律