抽象类 vs 接口:如何在实际项目中做出正确选择?

简介: 小米讲解了Java中的抽象类和接口,分析了两者的异同及使用场景。抽象类适合共享状态和行为逻辑,接口适用于提供统一行为规范,尤其在多继承场景下。文中通过实例说明了如何选择使用抽象类或接口,帮助开发者更好地理解这两者在实际开发中的应用。



Hey 大家好!我是小米,今天我来跟大家聊聊 Java 基础中的两个非常重要的概念——抽象类和接口。相信学习过 Java 的小伙伴们对这两个词并不陌生,但是在实际开发中,很多人对它们的使用场景还是会有些疑惑。今天我们就深入探讨一下,看看抽象类和接口到底有哪些异同点,以及如何根据实际需求选择使用它们。

什么是抽象类?

抽象类,顾名思义,就是包含抽象方法的类。它用 abstract 关键字来修饰,是一种不能被实例化的类。这是什么意思呢?简单来说,抽象类只能通过继承来使用,不能直接创建一个对象。正因为如此,抽象类不能使用 final 修饰——因为 final 表示类不能被继承,而抽象类的存在意义就在于给其他类继承。

抽象类的几个特点:

  • 包含抽象方法:抽象方法也是用 abstract 修饰的,没有具体实现的内容。子类继承抽象类后,必须实现这些抽象方法。
  • 不能被实例化:抽象类不能直接创建对象,必须通过继承来使用。
  • 可以包含普通方法:抽象类不仅仅可以包含抽象方法,还可以包含普通方法。这样,你可以在抽象类中定义一些通用的行为逻辑,子类可以选择继承这些逻辑。
  • 有构造方法:虽然抽象类不能被实例化,但它可以有构造方法,通常用于被子类调用,以初始化抽象类中的成员变量。

什么是接口?

接口也是一种抽象类型,它的作用就是定义一些抽象方法。与抽象类不同的是,接口支持多继承,也就是说一个类可以实现多个接口,完美解决了 Java 单继承的限制问题。接口中的所有方法,默认情况下,都是 public abstract 修饰的抽象方法(Java8 之后有一些新变化,稍后会详细说)。

接口的几个特点:

  • 所有方法默认是 public abstract:接口中的方法默认情况下不需要明确标明 public abstract,但实际上它们都是公开的抽象方法。子类实现接口时,必须提供这些方法的实现。
  • 没有构造方法:接口不能有构造方法,因为它不是类的一种,它是一种行为的定义,不涉及对象的构造。
  • 支持多继承:一个类可以实现多个接口,从而打破 Java 单继承的局限性。
  • 接口中的成员只能是 public static final 的静态常量:接口中不能定义普通的成员变量,所有成员都是 public static final 修饰的静态常量。

抽象类和接口的相同点

虽然抽象类和接口看起来有很多不同,但它们也有一些相似之处:

  • 不能被实例化:无论是抽象类还是接口,都不能直接创建对象,必须通过继承或实现的方式来使用。
  • 定义抽象方法:抽象类和接口都可以定义抽象方法,子类或实现类必须重写这些方法。

抽象类和接口的不同点

接下来,我们看看抽象类和接口在具体使用中的区别:

  • 构造方法
  • 抽象类可以有构造方法,用于初始化抽象类的成员变量。
  • 接口没有构造方法,因为接口不负责对象的创建与初始化。
  • 普通方法的支持
  • 抽象类可以包含普通方法,子类可以继承并使用这些方法。
  • Java 8 之前,接口中只能有抽象方法。Java 8 之后,接口可以定义 default 方法和 static 方法,default 方法可以有默认实现,子类可以选择是否重写。
  • 继承和实现的规则
  • 抽象类只能被单继承,一个子类只能继承一个抽象类。
  • 接口可以多继承,一个类可以实现多个接口,这给了 Java 类设计更多的灵活性。
  • 成员变量的定义
  • 抽象类可以定义各种类型的成员变量(静态的、非静态的、常量等)。
  • 接口中的成员变量只能是 public static final 修饰的静态常量。

抽象类的使用场景

当你想要约束子类具有某些共同的行为,并且希望提供一些默认实现或者共享的状态时,抽象类是一个不错的选择。比如你正在设计一个动物类(Animal),所有的动物都有呼吸和移动的能力,但具体怎么呼吸和怎么移动每种动物可能都不一样,这时候你就可以使用抽象类。

在这个例子中,Animal 类是一个抽象类,move 方法是抽象方法,具体由子类 Bird 来实现,而 breathe 方法则是一个普通方法,所有动物都可以直接使用。

接口的使用场景

如果你想要设计一些完全无关的类,它们之间并没有继承关系,但你希望它们实现相同的行为接口,那就使用接口吧!比如你有一些可以玩的东西,但它们可能是玩具、游戏或者是其他一些无关的类,这些类之间没有共同的父类,这时候接口就能大显身手了。

在这个例子中,ToyGame 两个类实现了 Playable 接口,它们各自提供了 play 方法的实现。这两个类之间没有任何继承关系,但它们都实现了 Playable 接口,表示它们都具备“可玩性”。

END

抽象类和接口是 Java 中两个非常重要的概念,它们都用于定义类的行为规范,但是它们的使用场景和特性各不相同:

  • 抽象类 适合用于共享状态和行为逻辑的场景,通常用于子类之间存在紧密联系时。
  • 接口 适合用于为无关类提供统一的行为规范,特别是当你需要实现多个行为时,接口的多继承特性非常有用。

大家在开发中,应该根据实际需求选择使用抽象类或接口。希望这篇文章能帮到你们,赶紧在项目中试一试吧!如果有什么疑问,欢迎在评论区讨论哦!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

相关文章
|
7天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
9天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1568 10
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
12天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
785 27
|
2天前
|
移动开发 JavaScript 前端开发
💻揭秘!如何用 Vue 3 实现酷炫的色彩魔方游戏✨
本文分享了开发基于Canvas技术的小游戏"色彩魔方挑战"的完整过程。游戏旨在考验玩家的观察力和耐心,通过随机生成的颜色矩阵和一个变化点,玩家需在两幅画布中找出不同的颜色点。文章详细讲解了游戏的核心功能,包括随机颜色矩阵生成、点的闪烁提示、自定义配色方案等。此外,作者展示了使用Vue 3和TypeScript开发的代码实现,带领读者一步步深入了解游戏的逻辑与细节。
103 68
|
2天前
|
存储 前端开发 JavaScript
🚀前端轻松实现网页内容转换:一键复制、保存图片及生成 Markdown
在现代前端开发中,提升用户的交互体验至关重要。本文将详细介绍如何使用 HTML2Canvas 和 Turndown 两个强大的 JavaScript 库,实现将网页选中文本转化为图片并保存或复制到剪贴板,或将内容转换为 Markdown 格式。文章包含核心代码实现、技术细节和功能拓展方向,为开发者提供了一个轻量级的解决方案,提升用户体验。
100 68
|
16天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
849 5
|
9天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
232 4
|
2天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
121 1
|
6天前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
476 2