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

完整教程:Java 抽象(abstract)关键字

完整教程:Java 抽象(abstract)关键字

1. 什么是 abstract 关键字?

abstract 是 Java 中一个非常重要的关键字,中文意思是"抽象的"。它就像一个“未完成的蓝图”或一个“概念模型”,用来定义一些必须存在但暂时无法确定具体实现的东西。

核心思想:

  • 规定必须做什么(What),但不规定具体怎么做(How)。
  • 用于强制子类遵循某种结构或实现特定行为。
  • 提高代码的灵活性和可扩展性,是实现多态和框架设计的基础。

2. 如何理解抽象?一个生动的比喻

想象一下你要造车:

abstract 关键字就是用来编写这份《设计规范》的工具。

3. abstract 修饰类(抽象类)

当一个类被 abstract 修饰时,它就成为了一个抽象类。

3.1 语法与特点

// 使用 abstract 关键字声明一个抽象类
public abstract class Animal
{
// 抽象类可以包含普通字段
private String name;
// 抽象类可以包含普通方法(有具体实现)
public void eat() {
System.out.println("This animal is eating.");
}
// 抽象类可以包含抽象方法(没有方法体)
public abstract void makeSound();
}

3.2 抽象类的核心规则

  1. 不能实例化:你不能使用 new 关键字直接创建一个抽象类的对象。
    Animal myAnimal = new Animal();
    // 编译错误!Animal是抽象的,无法实例化
  2. 必须被继承:抽象类生来就是被当爸爸的。必须有一个子类(可以是普通类,也可以是抽象类)来继承它。
  3. 可以包含混合成员:抽象类里既可以有普通方法(带实现的),也可以有抽象方法(不带实现的),还可以有构造方法、字段等。这是一个与接口的关键区别。

4. abstract 修饰方法(抽象方法)

当一个方法被 abstract 修饰时,它就成为了一个抽象方法。

4.1 语法与特点

public abstract void makeSound();
// 注意:没有方法体{},直接以分号;结束
  • 没有方法体:抽象方法只有方法声明(方法名、参数、返回类型),没有大括号 {} 包裹的实现代码。
  • 必须在抽象类中:一个类如果包含了抽象方法,那么这个类必须被声明为抽象类(abstract class)。
  • 强制子类实现:任何继承了这个抽象类的普通子类必须重写(Override)父类中的所有抽象方法,并提供具体的实现。如果不重写,那么这个子类自己也必须声明为 abstract

5. 代码示例:从抽象到具体

让我们用 Animal 的例子把抽象类和抽象方法串起来。

5.1 定义抽象类和方法

// 抽象类:Animal(动物)
public abstract class Animal
{
private String name;
// 构造方法
public Animal(String name) {
this.name = name;
}
// 普通方法
public void sleep() {
System.out.println(name + " is sleeping. Zzz...");
}
// 抽象方法:动物都会叫,但叫声不同,所以定义为抽象的
public abstract void makeSound();
}

5.2 创建具体子类实现抽象方法

// 具体子类:Dog(狗)
public class Dog
extends Animal {
// 继承抽象类Animal
// 调用父类的构造方法
public Dog(String name) {
super(name);
}
// 必须重写(实现)抽象方法 makeSound()
@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}
// 具体子类:Cat(猫)
public class Cat
extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
// 实现了相同的抽象方法,但行为不同
System.out.println("Meow! Meow!");
}
}

5.3 使用这些类

public class Test
{
public static void main(String[] args) {
// Animal animal = new Animal("Generic Animal"); // 错误!不能实例化抽象类
Animal myDog = new Dog("Buddy");
// 多态:父类引用指向子类对象
Animal myCat = new Cat("Whiskers");
myDog.sleep();
// 输出: Buddy is sleeping. Zzz...
myDog.makeSound();
// 输出: Woof! Woof! (调用的是Dog类的实现)
myCat.sleep();
// 输出: Whiskers is sleeping. Zzz...
myCat.makeSound();
// 输出: Meow! Meow! (调用的是Cat类的实现)
}
}

6. 抽象类 vs 接口

这是一个初学者常见的困惑点。它们在概念上很相似,但有重要区别:

特性抽象类 (Abstract Class)接口 (Interface) (Java 8+)
关键字abstract classinterface
方法可包含抽象方法和具体方法Java 8 前只能有抽象方法,之后可包含 defaultstatic 方法
字段可以有任何类型的字段(普通、静态、常量)字段默认是 public static final(常量)
构造方法构造方法没有构造方法
继承类只能单继承一个抽象类类可以实现多个接口
设计目的“是一个”(IS-A) 关系,表示本质“具有一种能力”(CAN-DO) 关系,表示行为

简单选择原则:

  • 如果你想定义一些对象的基本本质(比如它们都是“动物”),并且需要包含一些公共的实现代码,用抽象类
  • 如果你想定义一些对象可以做什么的契约(比如“可飞行”、“可游泳”),并且不关心它们具体是什么,用接口

7. 总结

希望通过本篇让你对abstract关键字有了更深的理解

相关文章:

完整教程:Java 抽象(abstract)关键字

完整教程:Java 抽象(abstract)关键字pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

自建rustdesk服务器,不填写中继地址无法连接的解决

研究相当长时间,官方文档在配置服务器步骤时省略了关键一步,导致当你用定义文件名方式给客户直接使用客户端时,无法连接中继的问题,不在于客户端,而在于服务端过程省略,直接设置hbbs 服务的启动参数,添加-r <中继地址> -k_ 即可默认为 -r 0.0.0.0 服务端不能推导I…...

Typescript中Type 类型的实现原理

TypeScript 中的 "类型"(Type)是对值的结构和行为的抽象描述。它不直接参与运行时,而是在编译阶段用于约束值的形态,确保代码符合预期的契约。1.核心作用:定义 "允许的值" 的范围和操作规则2.与 JavaScript 的关系:TS 的类型系统是对 JS 值的补充描述…...

数据结构与算法-30.图-拓扑排序

一、拓扑排序定义 二、检测有向图中的环API设计实现过程 以上仅供参考,如有疑问,留言联系...

1.进制转化

...

CF1796E Colored Subgraphs

是一个读懂题意就能做出来的题。 题目意思就是要你进行某种树上剖分,求最短链可能的最大长度。 显然,有一个很容易的 DP 是设 \(f_i\) 为以 \(i\) 结尾的最短链长度,显然,它会从儿子中的最短链转移而来。 那么,在换根的过程中,我们需要记录一个全局最小值和全局次小值,可…...

MySQL 日期时间类型:从入门到精通的核心指南 - 指南

MySQL 日期时间类型:从入门到精通的核心指南 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

Map对象在JavaScript循环中的使用

在JavaScript中,Map对象是一种新的键值对集合数据结构,与传统的Object有着本质的差异。一个Map的键可以是任意值,包括函数、对象或任何原始值。Map对象与传统的Object相比,有以下几个显著的优点:键的范围不限于字符串和Symbol。 Map对象的键值对是有序的,即键值对的插入顺…...

戒己谨言

言一 高投入,低期待 —— 2025.9.13 言二 学习是以知识武装自己 —— 2025.9.13...

2025.9.13——1黄

普及/提高- B3873 [GESP202309 六级] 小杨买饮料 简单的背包dp,注意边界情况处理。...

安全加固:启动PostgreSQL 14服务器SSL加密的方法指南在CentOS 7环境中

在CentOS 7操作系统中配置PostgreSQL 14以启用SSL加密,需要进行以下步骤: 1. 安装PostgreSQL 14: 首先确保安装了PostgreSQL 14,可以通过以下命令安装: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest…...

更美观的网页布局

更美观的网页布局<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=d…...

更灵活易用、延迟超低、更多情感语音支持!地表最强 Voice Agent 开源框架再进化!丨TEN Framework 更新

Hi !RTE 开发者社区的新老朋友们大家好,恰逢 TEN Framework 开源一周年之际,TEN 带着超厉害的 0.1.0 版 来了!TEN Framework 本次带来了多项功能更新和开发者体验提升,相信 TEN 将成为开发者构建下一代 Voice Agent 的开发利器!本次更新增加了简化的 main 概念,让开发者…...

详细介绍:【干货收藏】Transformer架构深度拆解:大模型入门核心指南

详细介绍:【干货收藏】Transformer架构深度拆解:大模型入门核心指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier N…...

实用指南:Terraform 从入门到实战:历史、原理、功能与阿里云/Azure 上手指南

实用指南:Terraform 从入门到实战:历史、原理、功能与阿里云/Azure 上手指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…...

Electron38-Wechat电脑端聊天|vite7+electron38仿微信桌面端聊天系统

最新研发Electron38+Vite7+Pinia3客户端仿微信聊天系统ElectronWinChat。 electron38-vue3-wechat基于vite7.1+electron38+pinia3+element-plus跨平台仿微信/QQ电脑端聊天Exe程序。封装electron多窗口管理、自定义系统导航栏。实现聊天、通讯录、收藏、朋友圈/短视频、我的等模…...

PsExec

PsExec keywords: PsTools PsExec 是一个可以远程连接其他Windows执行命令的工具,在SysinternalsSuite套件中。 下载链接: https://learn.microsoft.com/en-us/sysinternals/downloads/psexec 配置高级安全 Windows Defender 防火墙 -> 入站规则 -> 文件和打印机共享(S…...

详细介绍:开源AI智能客服与AI智能名片在S2B2C商城小程序客服管理中的应用与影响

详细介绍:开源AI智能客服与AI智能名片在S2B2C商城小程序客服管理中的应用与影响pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…...

深入解析:每日一算:电话号码的字母组合

深入解析:每日一算:电话号码的字母组合pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !import…...

华为系CEO,正在“接管”汽车圈?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087新CEO又是“华为人”?这不是一句调侃,而是正在车圈上演的现实剧本。就在9月5日,深蓝汽车宣布由原荣耀中国区CMO姜海荣接任C…...

Marvell,跌落神坛!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 在当今如日中天的AI时代,Marvell的股价震荡成为最刺眼的注脚。这家曾凭借AI定制芯片(ASIC)业务站上千亿美元市值的半导体巨…...

老同志们的93阅兵镜头

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选) 添加图片注释,不超过 140 字(可选) 添加图片注释,不超过 140 字(可选) 添加图片…...

英伟达老黄,又收购了一家AI编程公司

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087老黄正在看好什么?AI编程。这不,英伟达刚刚收购了一家AI coding初创公司,Agent方向。 添加图片注释,不超过 140 字(可选)…...

读人形机器人10酒店行业

读人形机器人10酒店行业1. 提升宾客体验 1.1. 长久以来,酒店一直是舒适与奢华的港湾1.1.1. 机器人正在重新定义服务艺术1.2. 在酒店业中,宾客体验至关重要 1.3. 温暖的欢迎、个性化的服务、对需求的预判—将一次普通入住转变为非凡体验 1.4. 人形机器人通过提供个性化、高效且…...

35岁不是终点,而是芯片人的爆发起点!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087致那些白天写架构、晚上修福报、凌晨一点还在回消息的“中年码神”们: 你写的不是代码,是人生的编译日志。 别等报错才想起—…...

开源安全与法律争议:OpenSSH枚举、DMCA诉讼与数据泄露事件解析

本文探讨OpenSSH用户枚举漏洞的时序攻击技术细节,分析DMCA第1201条对安全研究的法律限制,并回顾Canonical论坛数据泄露事件的技术背景与影响,涉及密码哈希机制与无线网络安全认知等实质性技术内容。法律行动与数字版权争议 电子前沿基金会(EFF)宣布对美国政府的诉讼,挑战…...

9.12-huenqi

1. 显示超出区域 小数位过长 2. 修改手机号未验证格式 3. 添加交易账户后租户id错误的添加成了用户id 4. 修改前密码和修改后密码可以一样 5. logo背景色不一致 6. 修改复选框后应直接查询 交易状态和领域和方法学搜索 7. 只用在待审批时修改 不应允许待审批资产上架 8. 信用和…...

P3983 赛斯石(赛后加强版)踢姐

简要题意 题目链接 商家手里有 \(si\) 个重量为 \(1\) 的赛斯石,每两个塞斯石可以合并为一个重量更大的塞斯石,最大重量不能超过 \(10\) ,合并得到的塞斯石的重量为先前两个塞斯石的重量总和,每种重量的塞斯石售价不同,现在一共有 \(10\) 种载重不同的船,每艘船的租金和载…...

huggingface hub 离线模式

最近在一个新集群上,计算节点不能联网,只有特殊节点可以联网。 现在的代码仓库依赖 huggingface hub 很严重,模型和数据集只能在特殊节点先下载好,然后在计算节点加载缓存。 为了不用绝对目录,可以设置环境变量 HF_HOME: export HF_HOME="dir_to_pub/.cache/huggin…...

鸿蒙应用开发环境搭建全攻略

鸿蒙应用开发的第一步是搭建稳定高效的开发环境。一个配置完善的开发环境能够显著提升开发效率,减少后续开发过程中的兼容性问题。本文将系统讲解从环境准备到项目创建的完整流程,帮助开发者快速上手鸿蒙应用开发。 鸿蒙系统及开发基础概述 鸿蒙系统(HarmonyOS)是华为推出的…...

深度学习求导原理深度解析

在深度学习的黑盒世界里,梯度计算如同神经网络的中枢神经系统。理解张量运算的反向传播机制,是打开这个黑盒的金钥匙。本文将穿透数学表象,揭示转置(Transpose)、求和(Summation)等关键算子背后的微分本质。 一、张量运算与梯度本质 张量运算的梯度本质上是线性变换的逆…...

ingress 配置说明

1、需求:testinfo.org域名下的所有子域名都转发到pgs-gateway的service。试了以下配置, - host: "*.testinfo.org" 不生效apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: pgs-gateway-ingress# 注解(annotations)取决于你使用的Ingress Control…...

场论笔记(二) 单位脉冲函数及其性质

在物理和工程技术中,除了用到指数衰减函数以外,还常常会碰到单位脉冲函数。因为有许多的物理现象具有脉冲性质,如在电学中,要研究线性电路受脉冲性质的电势作用后产生的电流;在力学中,要研究机械系统受冲击力作用后的运动情况等。研究此类问题就会产生我们要介绍的单位脉…...

MongoDB错误处理【1053】【1067】(意外断开读写中的数据库)

目录起因解决问题1:无法启动MongoDB服务[1053错误]解决问题2: 进程意外错误[1067错误]使用repair命令,扫描所有的本地数据修复(耗时长) 起因 本人的MongoDB服务在windows服务器运行,且一直有读写的操作。因为服务器突然断电导致出错,再次重启服务器后无法正常运行MongoD…...

实用指南:Python高级编程实战:装饰器、迭代器与生成器的深度应用

实用指南:Python高级编程实战:装饰器、迭代器与生成器的深度应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&…...

阅文记录

本文包括但不限于名著、网文、短篇、诗歌…… 一切被引用的都是完整阅读过的,评分纯属个人意愿如有不满意请忽略评分。 按照能够回忆起的顺序评价。 考虑到网文很多作者名字比较抽象就不放作者名了。 《龙族》 By 江南 9.5/10 江南你tm不得好死。 绘梨衣我的绘梨衣啊/ll 废物路…...

一个类继承一个接口的实现类、两个类实现同一个接口、两个类同时继承一个实现了某一接口的抽象类。三者的区别是什么呢

架构对比图类继承接口的实现类[接口]↑[实现类]↑[子类]子类通过继承获得接口的实现,可以选择性重写方法。两个类实现同一个接口[接口]↑ ↑ [类A] [类B]每个类独立实现接口,提供自己的行为实现。继承实现接口的抽象类[接口]↑[抽象类]↑ ↑ [类A] [类B]抽象类提供部…...

关于点在直线的哪一边的做法

题目:给以一个点 \(Q(x,y)\),问在一条直线 \(l: y=kx+b\) 的哪一边。 这个是非常经典的问题,我们只需要在直线上取两个点 \(F_1(x_1,y_1)\) 和 \(F_2(x_2,y_2)\),然后求出 \(\overrightarrow{QF_1}=(x_1-x,y_1-y)\) 和 \(\overrightarrow{QF_2}=(x_2-x,y_2-y)\)。然后判断…...

计算机常识

32位电脑、64位电脑指的是一次性处理32位的数据(20亿)、64位的数据32位数字如何表示浮点数?符号位、指数位、有效数字ASCII只能表示128种符号,有大小写字母常用符号,然后发明的UniCode码解决了不同国家的标准(16位 百万级字符数)半加器是用异或门和与门并联实现的什么是全…...

网络流,最大流,EK算法

概念 最大流: 从源点流向汇点的最大流量 增广路: 一条从源点到汇点的所有边的剩余容量>=0的路径 残留网: 由网络中所有结点和剩余容量大于0的边构成的子图,这里的边包括有向边和其反向边 模板题: 洛谷p3376 code: #include<iostream> #include<algorithm>…...

wifi7 MRU介绍

前言 WiFi 7 定义了几个关键技术,这里对其中的MRU技术进行介绍。 WiFi 7关键技术 320 MHz channel bandwidth Multiple Resource Units (MRUs) per stations (STAs) 4096-QAM Non-OFDMA preamble puncturing 名词解释 EHT 极高吞吐量 MU 多用户 RU 资源块 MRU 两个资源块拼成一…...

FallingLeaves 落叶纷飞组件 - yizi

...

Codeforces Round 1048 (Div. 2)

昨晚跟时队一起vp了 Codeforces Round 1048 (Div. 2)总结了一下就是D题犯糖了然后F还不会做,本质菜逼了。A. Maple and Multiplication 考虑 \(a\) \(b\) 相等或者互为倍数两种特殊情况即可。 int T, a, b;signed main(void) {for (read(T); T; T--) {read(a), read(b);if (a …...

当你发现是打表!!!

传送门 思路 这是一个晴朗的上午,你正在机房里打比赛,突然发现了第二题是一个打印斐波那契数列。此时的你想到了最近学过的矩阵快速幂,感觉到了一丝恶心,但你还是下定决心开始切这道题…… 时间过得真快,一转眼就过去了两转眼的时间,可是你的矩阵快速幂竟然打挂了。怎么办…...

VMware 17安装Oracle Linux 9.6 详细步骤

目录一、环境介绍二、创建虚拟机三、挂载镜像四、安装操作系统五、进入桌面 一、环境介绍类型 配置VMware VMware Workstation 17 Pro 17.6.4ISO Oracle Linux 9.6IP地址 192.168.184.121内存 8G硬盘 100G/boot 1G/swap 8G/ 91G是否图形化 图形化二、创建虚拟机三、挂载镜像四、…...

Div.2 E Rollup

2133E 不会做神秘构造 首先考虑到每个点必须进行一次询问,而链可以使每个点恰好进行一次询问。 然后只需要考虑用 \(\frac{1}{4}n\) 次操作拆链。若该点下有多条链或有两条链的合并点,则需要拆开。 这样父亲儿子一组点就至少有 \(4\) 个。...

synchronized的一些思考

synchronized的AI问答1. synchronized的可见性 加锁时:线程会清空工作内存中共享变量的值,从主内存重新加载最新值到工作内存。 解锁时:线程会将工作内存中修改后的共享变量值强制刷新到主内存。 Java 的happens-before原则明确规定:一个线程解锁监视器的操作,happens-bef…...

题解:CF2133C The Nether

挺好玩的交互题。 思路 首先,我们一定需要知道 DAG 中最长路径的起点,这可以通过 \(n\) 次询问来找到。即对于每一个点 \(i\) 满足 \(1\le i\le n\) 我们都去查询从 \(i\) 开始,经过整个 DAG 可以得到的最长路是多少,同时使用一个 vector 记录长度为 \(len\) 的点有哪些。 …...

实变函数1

实变函数1 集合 这些集合的运算我是直接没记,因为跟之前学的一样。幂集的话就是子集的构成的集合,这个集合族其实就是指标集到另一个集合的映射,这个象的集合。集列就是指标集是自然数集。De.morgen定理就是交和并的一个转化,证明也是采用的集合相等的常用思路证明互为子集…...

css背景

背景可以是一个颜色块,也可以是一张图片 html代码 <html><head><title>我的第一个代码</title><link rel="stylesheet" href="./public.css"></head><body><div class="box"><p class=&quo…...