面向对象 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. 具体方法
具体方法是指那些有完整实现的方法,即包含方法声明和方法体的方法。与之相对的是抽象方法,抽象方法只有声明没有实现。
具体方法是实际执行代码的地方,它们完成了类或接口所声明的功能。
具体方法的定义包括:
- 访问修饰符:如
public
、protected
、private
等; - 返回值类型,如果方法不返回任何值,则用
void
表示; - 方法名、参数列表(如果有),以及方法体。
- 方法体由一对大括号
{}
包围,里面包含了该方法执行的具体逻辑代码。
以下是一个具体方法的例子:
在这个例子中,Calculator
类有一个名为 add
的具体方法,它接受两个整数参数 num1
和 num2
,并返回它们的和。
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…...

外卖系统的JWT实现登录
1、什么是JWT jwt可以生成一个加密的token,作为用户登录的令牌,当用户登陆成功之后,发放给客户端。请求需要登录的资源或者接口的时候,将token携带,后端验证token是否合法。jwt有三部分组成: A:…...

基于springboot实现的家具销售电商平台
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…...

STM32中的Systick的使用
SysTick,全称System Tick Timer,是Cortex-M microcontrollers内核中提供的一个简单而有效的系统定时器,设计用来给操作系统提供时间基准,或用于生成周期性的中断。STM32系列微控制器,作为基于ARM Cortex-M内核的设备&a…...

做一个桌面悬浮翻页时钟
毛玻璃效果翻页桌面悬浮时钟,TopMost(Topmost“True”),不在任务栏显示(ShowInTaskbar“False”),在托盘区显示图标,双击托盘区图标实现最小化和还原,右键托盘图标可选“…...

Transformers中加载预训练模型的过程剖析(一)
使用HuggingFace的Transformers库加载预训练模型来处理下游深度学习任务很是方便,然而加载预训练模型的方法多种多样且过程比较隐蔽,这在一定程度上会给人带来困惑。因此,本篇文章主要讲一下使用不同方法加载本地预训练模型的区别、加载预训练模型及其配置的过程,藉此做个记…...

数据可视化的艺术:使用Matplotlib和Seaborn揭示数据故事
引言 数据可视化是数据分析中的关键一环,它帮助我们理解数据模式、趋势和异常。在Python中,Matplotlib和Seaborn是两个流行的数据可视化库,它们提供了丰富的图表和图形选项,使数据的可视化变得简单而强大。 Matplotlibÿ…...

2024全新小狐狸AI免授权源码
源码安装说明: 下 载 地 址 : runruncode.com/php/19757.html 1. 在宝塔新建一个站点,选择 PHP 版本为 7.2、7.3 或 7.4。将压缩包上传到站点的根目录,并设置运行目录为 /public。 2. 导入数据库文件,该文件位于 …...

Python基础详解四
目录 一,Json解析 二,pyecharts模块 三,类和对象 四,类型注解 一,Json解析 字典转换为JSON: import jsondata [{"name":"袁震","age":20},{"name":"张三&…...

es6新语法和ajax和json
es6新语法 1.定义变量:let 2.定义常量:const <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

Hadoop3:HDFS副本节点选择逻辑讲解
一、副本节点选择(机架感知) 说明 第一个副本,因为我们的client可能是web页,也可能是shell终端。 如果是web页,则随机选取一个节点,如果是shell终端,则选择当前shell终端所在的节点。 节点距离最…...