深入理解 Java 中的 `abstract` 关键字

news/2025/1/13 7:27:14/文章来源:https://www.cnblogs.com/happy-coding/p/18667750

目录

  1. 什么是 abstract 关键字?
    • 定义与用途
    • abstract 在类和方法中的区别
  2. 抽象类的特性
    • 何时使用抽象类
    • 抽象类的限制
  3. 抽象方法的定义与使用
    • 抽象方法的语法
    • 示例代码
  4. 抽象类与接口的比较
    • 相同点
    • 不同点
    • 选择建议
  5. 实战:如何设计抽象类
    • 具体案例分析
    • 代码实现
  6. 常见问题与最佳实践
    • 抽象类的常见误区
    • 使用建议

1. 什么是 abstract 关键字?

定义与用途

abstract 是 Java 中的一个修饰符,可以用来修饰类和方法。其主要目的是提供一种设计思路,帮助开发者构建可扩展和灵活的代码。

  • 抽象类(Abstract Class):一种不能直接实例化的类,通常用于定义一个通用的基类。
  • 抽象方法(Abstract Method):没有方法体的声明,必须由子类实现。

abstract 在类和方法中的区别

  • 抽象类

    • 可以包含抽象方法和具体方法。
    • 不能直接实例化。
    • 用于定义模板行为。
  • 抽象方法

    • 只有方法签名,没有方法体。
    • 必须在抽象类中声明。
    • 子类必须提供实现。

2. 抽象类的特性

何时使用抽象类

  • 当需要为一组相关类提供通用功能时。
  • 当某些方法的实现依赖于具体子类时。

抽象类的限制

  • 不能实例化。
  • 必须被继承。
  • 不能用来修饰静态方法。

3. 抽象方法的定义与使用

抽象方法的语法

abstract class Animal {// 抽象方法public abstract void makeSound();// 具体方法public void eat() {System.out.println("This animal eats food.");}
}

示例代码

abstract class Animal {public abstract void makeSound();public void sleep() {System.out.println("Sleeping...");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Woof Woof");}
}public class Main {public static void main(String[] args) {Animal myDog = new Dog();myDog.makeSound();myDog.sleep();}
}

输出:

Woof Woof
Sleeping...

4. 抽象类与接口的比较

相同点

  • 都可以用来定义行为的模板。
  • 都不能被直接实例化。

不同点

特性 抽象类 接口
方法实现 可以有具体方法 只能有默认方法和静态方法
多继承 单继承 支持多实现
变量 可以有实例变量 只能有静态常量

选择建议

  • 使用抽象类:当类之间有较强的继承关系时。
  • 使用接口:当需要定义行为而不关心具体实现时。

5. 实战:如何设计抽象类

具体案例分析

假设我们需要设计一个简单的支付系统,不同的支付方式(如信用卡支付、PayPal 支付)有共同的行为,但具体实现不同。

代码实现

abstract class Payment {public abstract void makePayment(double amount);public void transactionDetails(String transactionId) {System.out.println("Transaction ID: " + transactionId);}
}class CreditCardPayment extends Payment {@Overridepublic void makePayment(double amount) {System.out.println("Paid " + amount + " using Credit Card.");}
}class PayPalPayment extends Payment {@Overridepublic void makePayment(double amount) {System.out.println("Paid " + amount + " using PayPal.");}
}public class PaymentSystem {public static void main(String[] args) {Payment payment = new CreditCardPayment();payment.makePayment(150.0);payment.transactionDetails("12345ABC");payment = new PayPalPayment();payment.makePayment(75.5);payment.transactionDetails("98765XYZ");}
}

输出:

Paid 150.0 using Credit Card.
Transaction ID: 12345ABC
Paid 75.5 using PayPal.
Transaction ID: 98765XYZ

6. 常见问题与最佳实践

抽象类的常见误区

  1. 误解抽象类的用途:抽象类并不是为了代码复用,而是为了设计模板。
  2. 错误使用抽象方法:抽象方法不能有方法体。

使用建议

  • 仅在必要时使用抽象类,避免过度设计。
  • 使用抽象类时,应明确其作为模板的角色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868576.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读量子霸权02数字时代的终结

2000年前希腊人创造的安提基西拉仪器是计算机雏形,可计算月球运转。安提基西拉代表古代模拟宇宙巅峰。巴比奇未实现最先进机械计算机梦想。图灵被誉为“计算机科学之父”,提出图灵机概念。数字计算机比模拟计算机准确。图灵测试提出机器能否像人思考。1. 爱琴海的海底 1.1. 2…

行为树(BehaviorTree )的实现与应用

前言 我最近学习使用C#脚本实现Unity行为树,并使用行为树实现了对“空洞骑士”中,“假骑士”的AI行为逻辑的简单实现。本文主要记录了在这个过程中的一些要点。 行为树的原理及实现教程来自这位大佬的博客:游戏AI行为决策——Behavior Tree(行为树) 一、运作逻辑 行为树的…

48. django下载与基本使用

1.版本 django1.x:默认不支持异步 django2.x:默认不支持异步 django3.x:自带异步功能 2. 下载 2.1 pip安装pip install django==3.2.122.2 安装注意事项 计算机名称不能出现中文 注意python解释器版本与django版本的兼容性 项目中的文件名称不能出现中文 多个项目文件尽量不…

互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入门开始

前言 为什么我会想着制作一个智能桌面机器人呢?自问自答一下,看过我之前文章的小伙伴应该都知道我之前有为稚晖君开源的ElectronBot桌面机器人开发过一个桌面上位机软件叫电子脑壳,由于ElectronBot桌面机器人必须连接电脑才能使用,所以限制比较多,网友又对独立版本的桌面机…

C#进阶-在Ubuntu上部署ASP.NET Core Web API应用

随着云计算和容器化技术的普及,Linux 服务器已成为部署 Web 应用程序的主流平台之一。ASP.NET Core 作为一个跨平台、高性能的框架,非常适合在 Linux 环境中运行。本篇博客将详细介绍如何在 Linux 服务器上部署 ASP.NET Core Web API 应用,包括部署准备、应用发布、配置反向…

【CodeForces训练记录】Codeforces Round 996 (Div. 2)

训练情况赛后反思 开局连WA就知道这把完蛋了,应该要掉大分了,A题没考虑清楚,B题犯傻了一时间没看出来结论 A题 当且仅当两个人贴贴的时候,轮到谁走谁就输,后手可以把先手逼到两边,如果两人之间有一段距离,两人都必须往中间靠,如果两个人都往同一边走距离不变为无效操作…

2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One

2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One 焕新 Model Y 增配风阻降低到 0.22 Cd ✅ 车身变长到 4797 mm ✅ 车头保险杠新增一颗摄像头 ✅ 新增前排座椅通风 ✅ 新增后排座椅电动折…

Kernel Memory 让 SK 记住更多内容

Kernel Memory (KM) 是一种多模态 AI 服务,专注于通过自定义的连续数据混合管道高效索引数据集。它支持检索增强生成(RAG)、合成记忆、提示工程以及自定义语义记忆处理。KM 支持自然语言查询,从已索引的数据中获取答案,并提供完整的引用和原始来源链接。 通过 KM 我们可以…

大普时钟模块(Clock Module)

时钟模块(Clock Module) 同步精度高、保持能力强、温度稳定度高、频率准确度高、短稳性能强。 CM11T系列时钟模块,内置TCXO、超宽温,同步精度50ns CM55、CM22系列时钟模块,内置OCXO、超高精度 CM30系列时钟模块,内置OCXO、高频低噪 CM66系列时钟模块,内置OCXO+GNSS接收机 …

《CPython Internals》阅读笔记:p97-p117

《CPython Internals》学习第 7 天,p97-p117 总结,总计 21 页。 一、技术总结 1.词法分析(lexical analysis) 根据《Compilers-Principles, Techniques, and Tools》(《编译原理》第2版)第 5 页:The first phase of a compiler is called lexical analysis or scanning. T…

Qwen2ForSequenceClassification文本分类实战和经验分享

本文主要使用Qwen2ForSequenceClassification实现文本分类任务。 文章首发于我的知乎:https://zhuanlan.zhihu.com/p/17468021019 一、实验结果和结论 这几个月,在大模型分类场景做了很多实验,攒了一点小小经验。 1、短文本 1)query情感分类,一般不如BERT ps:结论和,htt…

Ubuntu22.04 解决 E: 无法定位软件包 yum

1、修改 sudo vim /etc/apt/sources.list的内容,将下文内容增加至该文件中:deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu…