【JAVA】关于抽象类的概念

在这里插入图片描述


个人主页:【😊个人主页】
系列专栏:【❤️初识JAVA】


前言

在Java中,抽象类是一种特殊的类,它无法被实例化。它只能被用作其他类的基类,以便子类可以继承它的属性和方法。今天我们就来谈谈JAVA中的抽象类。
在这里插入图片描述

抽象类

抽象类是一种特殊的类,它不能被实例化,而只能被继承。抽象类的主要作用是为其子类提供公共的抽象方法或属性的定义,让子类去实现如果一个类中有至少一个抽象方法,那么这个类必须被声明为抽象类

抽象方法是指只有方法头,没有方法体的方法。子类必须实现父类中的所有抽象方法,否则子类也必须被声明为抽象类。抽象类和抽象方法的关键字分别为abstract。

抽象类的特点

  1. 抽象类不能被实例化。
  2. 抽象类可以包含普通方法和属性。
  3. 抽象类中可以定义抽象方法。
  4. 继承抽象类的子类必须实现父类中的所有抽象方法,否则子类也必须被声明为抽象类。
  5. 抽象类可以允许不实现抽象方法,但这种情况下,子类必须再次声明抽象方法并实现它。

继承抽象类

Java继承抽象类是指一个子类通过继承一个抽象类来实现抽象类中定义的抽象方法,并可以重写非抽象方法。

实现方式

  1. 定义一个抽象类,使用abstract关键字,抽象类中可以包含抽象方法和非抽象方法。
public abstract class Animal {public abstract void run();public void eat() {System.out.println("eating...");}
}
  1. 定义一个子类,使用extends关键字继承抽象类。
public class Dog extends Animal {@Overridepublic void run() {System.out.println("Dog is running...");}
}

注意:子类必须实现抽象类中定义的所有抽象方法。

  1. 创建子类对象,并调用抽象类中的方法。
public class Main {public static void main(String[] args) {Animal animal = new Dog();animal.run(); // 输出:Dog is running...animal.eat(); // 输出:eating...}
}

注意:抽象类不能被实例化,但可以通过子类的对象来实现多态。

抽象方法

Java的抽象方法是一种没有实现代码的方法,需要由子类来实现具体的逻辑。在Java中,抽象方法必须被定义在抽象类中,抽象类不能被实例化,只能被继承。抽象类中可以包含非抽象方法,但至少要包含一个抽象方法。

声明抽象方法会造成以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
    继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
    如果Salary类继承了Employee类,那么它必须实现computePay()方法:

实例

public abstract class Shape {protected int x, y; // 坐标public Shape(int x, int y) {this.x = x;this.y = y;}// 抽象方法,必须在子类中实现public abstract void draw();// 普通方法public void move(int deltaX, int deltaY) {x += deltaX;y += deltaY;}
}public class Circle extends Shape {private int radius; // 半径public Circle(int x, int y, int radius) {super(x, y);this.radius = radius;}@Overridepublic void draw() {System.out.println("Drawing Circle");}
}public class Square extends Shape {private int side; // 边长public Square(int x, int y, int side) {super(x, y);this.side = side;}@Overridepublic void draw() {System.out.println("Drawing Square");}
}

在这个例子中,我们定义了抽象类Shape和其子类Circle和Square。Shape类包含了一个抽象方法draw()和一个普通方法move()。Circle和Square子类都继承了Shape类,并实现了draw()方法。由于draw()方法是抽象的,因此它必须被子类实现。在这个例子中,Circle和Square子类分别实现了自己的draw()方法,分别输出Drawing Circle和Drawing Square。

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

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

相关文章

线性代数基础-行列式

一、行列式之前的概念 1.全排列: 把n个不同的元素排成一列,称为n个元素的全排列,简称排列 (实际上就是我们所说的排列组合,符号是A,arrange) 2.标准序列: 前一项均小于后一项的序列…

[Linux入门]---管理者操作系统

文章目录 1.操作系统概念2.设计操作系统的目的3.操作系统如何进行管理系统调用和库函数概念 1.操作系统概念 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括: 内核(进程管理,内存…

ISP技术概述

原本或许是为了对冲手机系统和APP设计无力感而诞生的拍照功能,现今却成为了众手机厂家除背部设计外为数不多可“卷”的地方,自拍、全景、夜景、小视频等旺盛的需求让这一技术的江湖地位迅速变化。对圈内人士而言,这一波变化带来的后摄、双摄、多摄、暗光、防抖、广角、长焦、…

AVLoadingIndicatorView - 一个很好的Android加载动画集合

官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …

GitStats - 统计Git所有提交记录工具

如果你是研发效能组的一员或者在从事 CI/CD 或 DevOps,除了提供基础设施,指标和数据是也是一个很重要的一环,比如需要分析下某个 Git 仓库代码提交情况: 该仓库的代码谁提交的代码最多 该仓库的活跃度是什么样子的 各个时段的提交…

安装Linux虚拟机——以ubuntukylin-16.04.7-desktop-amd64.iso为例

正文 安装VMware 重要提示 安装软件之前,请先退出360、电脑管家等安全类软件,这类软件会阻止我们安装的软件进行注册表注册,很可能导致安装失败。确认物理机(也就是你自己使用的电脑)的防火墙已经关闭。 下载 打开…

python web编程一:token、session、cookie、密码加解密

1 认证 1 传统的session-cookie机制 HTTP协议是无状态协议,为了解决它产生了cookie和session技术。 浏览器发起第一次请求到服务器,服务器发现浏览器没有提供session id,就认为这是第一次请求,会返回一个新的session id给浏览器…

数据仓库整理

数仓 olap vs oltp OLTP主要用于支持日常的业务操作,如银行交易、电子商务等,强调数据的准确性、实时性和并发性。OLAP主要用于支持复杂的数据分析,如数据仓库、决策支持等,强调数据的维度、聚合和可视化。 将OLTP数据库的数据…

C++之lseek64应用总结(二百三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

CMU15-445 format\clang-format\clang-tidy 失败

CMU15-445 format\clang-format\clang-tidy 失败 问题修改 问题 -- Setting build type to Debug as none was specified. -- Youre using Clang 14.0.0 CMake Warning at CMakeLists.txt:67 (message):BusTub/main couldnt find clang-format.CMake Warning at CMakeLists.tx…

Python中使用EMD(经验模态分解)

在Python中使用EMD(经验模态分解)进行信号分解时,通常可以设置信号分解的数目。EMD算法的目标是将信号分解成多个称为“本征模态函数”(Intrinsic Mode Functions,简称IMF)的成分,每个IMF都代表…

【设计模式】组合模式

文章目录 1.组合模式定义2.组合模式的结构2.1. 安全式组合模式的结构2.2.透明式组合模式的结构 3.组合模式实战案例3.1.场景说明3.2.关系类图3.3.代码实现 4.组合模式优缺点5.组合模式适用场景6.组合模式总结 主页传送门:💁 传送 1.组合模式定义 组合模式…

服务注册发现_actuator微服务信息完善

SpringCloud体系里的&#xff0c;服务实体向eureka注册时&#xff0c;注册名默认是IP名:应用名:应用端口名。 问题&#xff1a; 自定义服务在Eureka上的实例名怎么弄呢 在服务提供者pom中配置Actuator依赖 <!-- actuator监控信息完善 --> <dependency><groupId…

2 C++中的引用

C中的引用 上节说到&#xff0c;变量名实际上是一段连续存储空间的别名。很显然我们可以将其命名为其它名字&#xff0c;就像我们有乳名、小名一样。 C引入了引用的概念。 引用可以看作一个已定义变量的别名引用的语法 type& name variate;普通引用在声明时必须用其它的…

springboot和vue:二、springboot特点介绍+热部署热更新

springboot特点介绍 能够使用内嵌的Tomcat、Jetty服务器&#xff0c;不需要部署war文件。提供定制化的启动器Starters&#xff0c;简化Maven配置&#xff0c;开箱即用。纯Java配置&#xff0c;没有代码生成&#xff0c;也不需要XML配置。提供了生产级的服务监控方案&#xff0…

如何在 SOLIDWORKS中创建零件模板 硕迪科技

作为一款多功能且可大量定制的 3D CAD 软件&#xff0c;SOLIDWORKS模板可以通过自定义属性包含大量数据。可以通过为SOLIDWORKS零件、装配体和工程图创建模板来利用这些模板。 与其他一些CAD软件不同&#xff0c;SOLIDWORKS不限制您可以创建的模板数量 - 您可以根据需要创建任…

在项目中,关于前端实现数据可视化的技术选择

前言 在项目中&#xff0c;数据可视化以图表、报表类型为主。 需求背景 技术框架是Vue2.x版本&#xff0c;组件库是Ant Design of Vue能够支撑足够多的图表类型开发图表大小/位置能够随意变动图表样式需要支持丰富多样的用户配置强大、开放的图表语法支持复杂的数据可视化场景…

【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 逻辑回归Logistic类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现逻…

Linux 目录结构介绍

对上面的说明: root 目录 &#xff1a; linux 超级权限 root 的主目录 home 目录 &#xff1a; 系统默认的用户主目录&#xff0c;如果添加用户是不指定用户的主目录&#xff0c;默认在/home 下创建与用户同名的文件夹 bin 目录 &#xff1a; 存放系统所需要的重要命令&am…

uniapp Echart X轴Y轴文字被遮挡怎么办,或未能铺满整个容器

有时候布局太小&#xff0c;使用echarts&#xff0c;x轴y轴文字容易被遮挡&#xff0c;怎么解决这个问题呢&#xff0c;或者是未能铺满整个容器。 方法1&#xff1a; 直接设置 containLabel 字段 options: { grid: { containLabel: true, },} 方法2: 间接设置&#xff0c;但是…