当前位置: 首页 > news >正文

面向对象 07:抽象类相关知识,抽象类的基本概念,使用方式,以及一些注意事项

一、前言

记录时间 [2024-05-15]

系列文章简摘:
面向对象 03:类与对象的创建、初始化和使用,通过 new 关键字调用构造方法,以及创建对象过程的内存分析
面向对象 04:三大特性之——封装,封装的含义和作用,以及在 Java 中的使用方式,附完整的测试案例代码
面向对象 05:三大特性之——继承,继承在 Java 中的相关使用,区分关键字 super 和 this,方法重写的注意点
面向对象 06:三大特性之——多态,多态的基本概念和相关使用,关键字 instanceof,以及对象间的类型转换

更多 Java 相关文章,请参考专栏哦。

本文讲述了 Java 面向对象编程中的重要概念——抽象类的相关知识,包括基本概念、如何使用,以及一些注意事项。


二、基本概念

在 Java 中,抽象类(Abstract Class)是一种不能被实例化的类,它的主要目的是为了提供一个类族的通用模板。

抽象类可以包含抽象方法(abstract methods)和具体方法(concrete methods)。

抽象类是 Java 面向对象编程中的一个重要概念,它有助于实现软件的模块化、扩展性和可维护性。

1. 抽象方法

抽象方法是没有具体实现的方法,它只有声明而没有方法体,即没有花括号 {} 包裹的代码部分,并且必须在方法声明中使用 abstract 关键字。

抽象方法需要在其子类中被具体实现。

  • 如果一个非抽象类继承了某个抽象类,那么这个非抽象类要具体实现抽象类的抽象方法。
  • 但如果是另一个抽象类继承了某个抽象类,就不需要具体实现。

2. 具体方法

具体方法是指那些有完整实现的方法,即包含方法声明和方法体的方法。与之相对的是抽象方法,抽象方法只有声明没有实现。

具体方法是实际执行代码的地方,它们完成了类或接口所声明的功能。

具体方法的定义包括:

  • 访问修饰符:如 publicprotectedprivate 等;
  • 返回值类型,如果方法不返回任何值,则用 void 表示;
  • 方法名、参数列表(如果有),以及方法体。
  • 方法体由一对大括号 {} 包围,里面包含了该方法执行的具体逻辑代码。

以下是一个具体方法的例子:

在这个例子中,Calculator 类有一个名为 add 的具体方法,它接受两个整数参数 num1num2,并返回它们的和。

public class Calculator {// 具体方法:计算两数相加public int add(int num1, int num2) {return num1 + num2;}
}

三、抽象类的使用

1. 为什么使用抽象类

  • 设计模板:抽象类为子类提供了一个公共的接口和实现框架,确保了子类具有统一的结构。
  • 代码复用:通过包含具体方法,抽象类可以提供通用功能的实现,避免重复代码。
  • 强制实现:要求子类必须实现某些方法,保证了类型的一致性。

2. 定义抽象类

要定义一个抽象类,需要在类的声明前加上 abstract 关键字。

抽象方法必须写在抽象类中。

例如,Animal 是一个抽象类,它包含一个抽象方法 eat() 和一个具体方法 sleep()

public abstract class Animal {// 抽象方法,是一种约束// 只有方法名字,没有方法的实现public abstract void eat();// 具体方法public void sleep() {System.out.println("Zzz...");}
}

3. 继承抽象类

子类继承抽象类时,如果子类不是抽象类,那么它必须实现父类中的所有抽象方法。

子类继承抽象类,使用 extends 关键字,属于单继承。

例如,在这个例子中,Dog 类继承了 Animal 类,并实现了 eat() 方法。

// 继承抽象类的子类,必须要实现抽象类中的所有抽象方法
// 子类不是抽象类
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating.");}
}

四、注意事项

  • 抽象类不能被实例化,即,不能直接创建一个抽象类的对象。
  • 如果一个类包含了至少一个抽象方法,那么这个类必须声明为抽象的。
  • 抽象类可以有构造方法,用于被其子类调用初始化共通的属性或进行一些初始化操作。
  • 抽象类的子类可以是抽象的,也可以是非抽象的。

1. 抽象类不能创建对象

抽象类不能使用 new 关键字直接创建对象。

原因:抽象类的主要目的是作为一个基类来提供其他类继承的通用接口或共享的实现,它可能包含未实现的抽象方法,这些方法需要在具体的子类中得到实现。

当试图使用 new 关键字实例化一个抽象类时,Java 编译器会报错,提示不能实例化抽象类。

如何用抽象类的特性:

  • 创建一个继承自该抽象类的具体子类;
  • 并在子类(非抽象类)中实现所有的抽象方法;
  • 然后通过这个子类来创建对象。

例如,在这个例子中,虽然我们不能直接创建 Animal 类的实例,但我们可以通过创建其子类 Dog 的实例,并通过多态的方式,让 myDog 引用指向 Dog 对象,从而间接使用抽象类 Animal 定义的结构。

// 抽象类
abstract class Animal {abstract void sound();
}// 具体子类
class Dog extends Animal {void sound() {System.out.println("The dog barks.");}
}// 创建对象
public class Main {public static void main(String[] args) {// 错误// 不能这样创建:Animal animal = new Animal(); // 应该这样Animal myDog = new Dog();myDog.sound();  // 输出:The dog barks.}
}

2. 抽象类有构造方法

虽然抽象类不能使用 new 关键字直接创建对象,但抽象类可以有构造方法 constructor

构造方法在抽象类中主要有如下用途:

  • 初始化抽象类的成员变量
    • 抽象类可能包含实例变量,构造方法可以用来初始化这些变量。
    • 这对于确保抽象类的子类继承了恰当的状态是非常有用的。
  • 被子类构造方法调用
    • 当一个子类继承抽象类时,子类的构造方法默认会调用父类(这里指抽象类)的无参构造方法,除非子类构造方法中显式地调用了父类的其他构造方法。
    • 这意味着,即使不能直接创建抽象类的实例,它的构造方法也会在创建子类实例时被调用到。

例如,在下面这个例子中,抽象类 Animal 有一个带参数的构造方法,用于设置动物的名字。子类 Dog 的构造方法通过 super 关键字调用了父类的构造方法来初始化 name 成员变量。

这表明,即使抽象类本身不能被实例化,其构造方法仍然是有意义且必要的。

abstract class Animal {String name;// 抽象类的构造方法public Animal(String name) {// 初始化name成员变量this.name = name; }abstract void sound();
}class Dog extends Animal {public Dog(String name) {// 子类构造方法调用父类(抽象类)的构造方法super(name); }@Overridevoid sound() {System.out.println(name + " says Woof!");}
}public class Main {public static void main(String[] args) {Dog myDog = new Dog("Buddy");myDog.sound();  // 输出:Buddy says Woof!}
}

五、总结

本文讲述了 Java 面向对象编程中的重要概念——抽象类的相关知识,包括基本概念、如何使用,以及一些注意事项。

一些参考资料

狂神说 Java 零基础:https://www.bilibili.com/video/BV12J41137hu/
TIOBE 编程语言走势: https://www.tiobe.com/tiobe-index/
Typora 官网:https://www.typoraio.cn/
Oracle 官网:https://www.oracle.com/
Notepad++ 下载地址:https://notepad-plus.en.softonic.com/
IDEA 官网:https://www.jetbrains.com.cn/idea/
Java 开发手册:https://developer.aliyun.com/ebook/394
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/

相关文章:

面向对象 07:抽象类相关知识,抽象类的基本概念,使用方式,以及一些注意事项

一、前言 记录时间 [2024-05-15] 系列文章简摘: 面向对象 03:类与对象的创建、初始化和使用,通过 new 关键字调用构造方法,以及创建对象过程的内存分析 面向对象 04:三大特性之——封装,封装的含义和作用&a…...

Rust中的链式调用方法

在Rust编程语言中,链式调用是一种流行的编程模式,它允许开发者以流畅、连续的方式调用多个方法。这种风格不仅提高了代码的可读性,而且使得复杂的操作可以串联在一起,形成一个清晰、简洁的语句。在Rust中,链式调用主要…...

xCode升级后: Library ‘iconv2.4.0’ not found

报错信息: targets 选中 xxxNotification: Build Phases ——> Link Binary With Libraries 中,移除 libiconv.2.4.0.tbd libiconv.2.4.0.dylib 这两个库(只有一个的移除一个就好)。 然后重新添加 libiconv.tbd 修改完…...

SQL语言:完整性约束

完整性约束 数据完整性是指存储在数据库中的数据要能正确反映实际情况,规定输入的数据不能是无效值、错误值 或者乱码等。 一、非空约束: 非空约束关键字: not null 1、非空约束的创建 create table teacher( t_id int not null, -- 为教…...

UBUNTU下CMAKE指定执行文件运行时查找库的路径

在Ubuntu下,使用CMake时,如果需要指定执行文件运行时库的搜索路径,可以在CMakeLists.txt文件中通过set_target_properties命令来设置。 以下是一个示例,假设你的目标是一个名为my_application的可执行文件,你想要添加…...

WHAT - CSS Animationtion 动画系列(四)- 移动端全屏动画

目录 一、背景1.1 GIF & Video1.2 存在的问题 二、技术方案2.1 使用CSS动画和JavaScript2.2 使用JavaScript库2.3 使用序列帧1. css animation 帧动画2. JavaScript requestAnimationFrame 帧动画 2.4 使用Canvas1. html 和 canvas 中的 video2. 基于Canvas的动画库 今天我…...

springboot004网页时装购物系统

springboot004网页时装购物系统 亲测完美运行带论文:获取源码,私信评论或者v:niliuapp 运行视频 包含的文件列表(含论文) 数据库脚本:db.sql其他文件:ppt.pptx论文/文档:开题报告.docx论文&…...

海外住宅IP介绍

住宅IP,通俗的来讲就是分配给家庭的IP地址,ISP默认分配用户为家庭用户,其真实性与安全性都有一定保障。海外住宅IP是指由海外互联网服务提供商分配给家庭用户的IP地址,IP地址通常是静态的,稳定的,可以为用户…...

Qt | QTimer 类(计时器)

01、相关知识回顾 Qt C++ | QTimer经验总结Qt | QDateTimeEdit、QDateEdit类和QTimeEdit类02、QTimer 类 1、QTimer 类是 QObejct 的直接子类,该类用于实现计时器,QTimer 类未继承自 QW...

SQL 面试系列(一)【留存率问题】

前言 在学 HQL 之前是不太了解 SQL 的,以为 SQL 只可以实现 CRUD ,直到面试的公司让我下去多了解一些 SQL ,我才最近开始再次深入学习 MySQL 和 Oracle。而且越学越发现 SQL 真的是一门很有深度的语言,我以前的使用只是皮毛而已&a…...

2024OD机试卷-游戏分组 (java\python\c++)

题目:游戏分组 题目描述 部们准备举办一场 王者荣耀 表演赛,有 10 名游戏爱好者参与,分为两队,每队 5 人。 每位参与者都有一个评分,代表着他的游戏水平。为了表演赛尽可能精彩,我们需要把 10 名参赛者分为实力尽量相近的两队。 一队的实力可以表示为这一队 5 名队员的…...

重装前端整体流程

用户管理 --汇总 -- 明细-CSDN博客 一、node 这个看环境变量 2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了_nodejs安装及环境配置-CSDN博客 配置到国内镜像的时候,去看,淘…...

Oracle Database 23ai Free版本体验

Oracle Database 23ai 体验链接: Oracle Database 23ai Free (https://www.oracle.com/database/free/get-started/) Autonomous Database 23ai Container Image (https://www.oracle.com/autonomous-database/free-trial/) Oracle GoldenGate 23ai (https://www…...

84.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-筛选与技能有关的数据包

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…...

维护表空间中的数据文件

目录 向表空间中添加数据文件 从表空间中删除数据文件 删除users表空间中的users02.dbf数据文件 对数据文件的自动扩展设置 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 维护表空间中的数据文件主要包括向表空间中添…...

2024五月母亲节嘉年华活动方案

2024以花之名 致谢母亲簪花趣味亲子五月母亲节嘉年华活动方案-43P 活动策划信息: 方案页码:43页 文件格式:PPT 方案简介: 岁月温柔治愈 母爱闪闪发光 一年一度的PY圈孝子孝女大赛即将到来 本次母亲节,“以花之名…...

Linux 第三十三章

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…...

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势,其市场价值不仅体现在竞赛本身,还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目,包括竞速赛、技巧赛、航拍赛等。每个项目…...

CAD插入文字到另一图形样式变相同

CAD从一张图形复制到另外一张图形后,文字样式变成一样是因为两张图所用的文字样式名称一样,但是样式里面的使用字体样式不一样。如下图所示,找到工具栏中的注释 ,点击文字样式。里面就会显示当前图形中使用的样式名称及其对应的字…...

算法随想录第八天打卡|344.反转字符串,541. 反转字符串II, 卡码网:54.替换数字, 151.翻转字符串里的单词,卡码网:55.右旋转字符串

344.反转字符串 建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 题目链接/文章讲解/视频讲解:代码随想录 Python class Solution:def reve…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

什么是VR全景技术

VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...