Java抽象类:类的幕后黑手,提供继承和扩展的框架。

在这里插入图片描述

  • 👑专栏内容:Java
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、抽象类的概念
  • 二、注意事项
  • 三、抽象类的作用


一、抽象类的概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

在Java中被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。要注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法。抽象类在编程中的作用就是创建一个抽象类通常是为了提供一个基础的、可以被其他更具体的类继承和扩展的框架。

举个实际的例子,以下面的图形类为例。
在这里插入图片描述

class Shape{
    public void draw(){
        //System.out.println("画图");
    }
}
class Cycle extends Shape{
    @Override
    public void draw() {
        System.out.println("⭕");
    }
}
class Rect extends Shape{
    public void draw(){
        System.out.println("矩形");
    }
}
public class demo1 {
    public static void drawMap(Shape shape){
        shape.draw();
    }
    public static void main(String[] args) {
        drawMap(new Rect());
        drawMap(new Cycle());
    }
}

在这个打印图形例子中发现,父类 Shape 中的draw 方法好像并没有什么实际工作。即使父类的draw方法里面不写任何内容,也不影响程序的正常进行。主要的绘制图形都是由 Shape 的各种子类的 draw 方法来完成的。像这种没有实际工作的方法,我们可以把它设计成一个抽象方法,包含抽象方法的类我们称为抽象类。 现在可以将上面的 Sharp 类更改为抽象类。

abstract class Sharp{
    public abstract void draw ();
}

二、注意事项

  1. 抽象类和抽象方法的修饰符: 在编程中,抽象类和抽象方法都是使用关键字abstract进行修饰的。这个修饰符标识着类或方法是抽象的,即它们不完全具体化,需要在子类中进一步定义或实现。

  2. 抽象类的实例化: 抽象类不能被实例化,这意味着你不能直接创建一个抽象类的对象。这是因为抽象类通常包含不完整的方法,需要子类来具体实现这些方法。

  3. 抽象方法和抽象类的关系: 一个类如果包含至少一个抽象方法,则这个类必须被声明为抽象类。但是,一个抽象类不一定要包含抽象方法,它也可以只提供一些通用的实现。

  4. 抽象类中的成员: 抽象类可以包含普通的成员变量和成员方法。这些成员变量和方法可以被子类继承和使用,或者在子类中被覆盖。

  5. 继承抽象类的普通类: 当一个普通类继承一个抽象类时,它必须实现(或称为“重写”)抽象类中的所有抽象方法。这是因为普通类必须是完全具体化的。

  6. 抽象类的意义: 抽象类的主要目的是为了被其他类继承。它提供了一个共同的模板,确保所有子类都具有一定的通用行为。

  7. 抽象类继承与方法重写: 当一个抽象类继承另一个抽象类时,它可以不立即实现父类中的抽象方法。但是,如果一个普通类继承一个抽象类,那么它必须实现所有继承的抽象方法。

  8. 抽象类的限制: 由于抽象类的目的是为了被继承和实现,它们不能被声明为finalstatic,这些修饰符会限制类的继承和方法的覆盖。抽象方法也不能是private,因为私有方法不能被子类访问或重写。

  9. finalabstract的冲突: final关键字表示一个类或方法不能被修改或继承,而abstract表示需要进一步的实现或扩展。因此,这两个关键字在概念上是对立的,不能同时用于同一个类或方法上。

  10. 抽象类中的构造方法: 抽象类可以有构造方法。这些构造方法不用于直接创建对象,而是在子类对象的创建过程中用于初始化继承自抽象类的成员变量。

三、抽象类的作用

抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类。然后让子类重写抽象类中的抽象方法。

【问题】普通的类也可以被继承,普通的方法也可以被重写,为啥非得用抽象类和抽象方法呢?
使用抽象类相当于多了一重编译器的校验。使用抽象类的场景就如上面的代码,实际工作不应该由父类完成, 而应由子类完成。那么此时如果不小心误用成父类使用普通类编译器是不会报错的。但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。

很多语法存在的意义都是为了 “预防出错”,例如final也是类似。 创建的变量用户不去修改,不就相当于常量嘛?但是加上final能够在不小心误修改的时候,让编译器及时提醒我们。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Facebook的这份开源协议使React四面楚歌

如果你觉得一些科技公司看起来很美好,每天都在“改变世界”……你应该看看他们的用户条款和法律文书,藏污纳垢之严重令人震惊。 最近,百度和阿里巴巴内部的软件工程团队不约而同做了一件事——弃用 React。 解释下: React 是一个…

Web框架与Django路由层

Web框架 一 web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能&…

MicroPython STM32F4 RTC功能使用介绍

MicroPython STM32F4 RTC功能使用介绍 🔖STM32和ESP32 RTC功能差不多,相关篇《MicroPython ESP32 RTC功能使用介绍》📌固件刷可参考前面一篇《STM32刷Micropython固件参考指南》🌿 相关篇《Micropython STM32F4入门点灯》&#x1…

java设计模式 开闭原则

开闭原则(Open-Closed Principle,OCP)是面向对象设计中的一个重要原则,它指导着我们如何设计和组织代码,以便使系统在扩展性和可维护性方面更加优秀。 开闭原则的定义是:软件实体(类、模块、函数…

纵行科技获评“汽车物流行业优秀技术装备供应商”

近日,由中国物流与采购联合会主办,中物联汽车物流分会承办的“2023年全国汽车物流行业年会”在湖北十堰盛大召开。本次年会集合了汽车整车、零部件、售后备件、进出口物流企业和物流装备技术企业、科研机构及院校等,分享汽车物流行业现状、相…

java文件上传以及使用阿里云OSS

JavaWeb 文件上传本地存储阿里云OSS配置文件 yml配置文件 文件上传 前端页面三要素: 表单项type“file” 表单提交方式post 表单的enctype属性multipart/form-data 本地存储 保证上传的文件不重复 //获取原始文件名String originalFilename image.getOriginalFi…

0-1背包的初始化问题

题目链接 这道题的状态转移方程比较易于确定。dp[i][j]表示能放前i个物品的情况下,容量为j时能放物品的数量(这道题歌曲数量对应物品数量,容量对应时间)。 技巧(收获) 二维dp数组可以视情况优化为一维dp数组…

Spring Boot 3 + Spring Security 6 最新版本修改 Json 登录后 RememberMe 功能问题失效的解决方案

当 Spring Boot 版本更新到 3 之后,最低要求的 JDK 版本变为 17,相应的 最新版本的 Spring Security 的配置也发生了变化,一下主要讲解一些新的 Spring Security 的配置方法 1. 配置由继承WebSeucrityConfigurerAdapter变成只需添加一个Secur…

人工智能-优化算法之梯度下降

梯度下降 尽管梯度下降(gradient descent)很少直接用于深度学习, 但了解它是理解下一节随机梯度下降算法的关键。 例如,由于学习率过大,优化问题可能会发散,这种现象早已在梯度下降中出现。 同样地&#x…

一款多功能露营专用氛围灯

一、主要功能 使用COB灯丝3D打印构建精妙的螺旋线条露营灯 选用IP5328P作为电源主控,支持双向PD快充,支持PPS档位输出 电池仓结构设计兼容26650(不可更换)或21700/18650(可更换)电池 使用WS2812灯组成顶…

内置函数【MySQL】

文章目录 MySQL 内置函数日期和时间函数字符串函数数学函数信息函数参考资料 MySQL 内置函数 MySQL 的内置函数主要分为以下几种: 字符串函数:用于对字符串进行操作,如连接、截取、替换、反转、格式化等。数值函数:用于对数值进…

【vue】v-model在表单元素上的应用

表单元素&#xff1a; https://blog.csdn.net/m0_67930426/article/details/134655644 使用模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head><body>&l…

小程序静默授权获取unionid

文章目录 导文文章重点 导文 小程序静默授权获取unionid 文章重点 用wx.login(Object object)放到app.js里面 wx.login({success (res) {console.log(123);if (res.code) {//发起网络请求// wx.request({// url: https://example.com/onLogin,// data: {// code: res.…

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

linux获得帮助_如何查看命令的用法、作用

Linux获得帮助 多层次的帮助&#xff1a; whatis command --help man and info /usr/share/doc/ Red Hat documentation 、Ubuntu documentation 软件项目网站 其它网站 搜索 whatis 使用数据库来显示命令的简短描述。 [rootlocalhost ~]# whatis rm rm (1) …

基于FPGA的五子棋游戏设计

基于FPGA的五子棋游戏设计 本文基于FPGA设计五子棋游戏&#xff0c;使用按键输入&#xff0c;使用VGA接口输出。五子棋的棋具与围棋相同&#xff0c;棋子分为黑白两色&#xff0c;棋盘为1010&#xff0c;棋子放置于棋盘线交叉点上。两人对局&#xff0c;各执一色&#xff0c;轮…

仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送

源码简介&#xff1a; 进云仿美团外卖源码&#xff0c;作为外卖平台源码&#xff0c;它不仅支持多商户、多样化配送费、本土外卖&#xff0c;还支持第三方配送。 进云仿美团外卖源码是一个进云源生插件&#xff0c;支持多商户多样化配送费模式本土外卖平台支持第三方配送&…

Unity针对XBOX,SWITCH,PS5手柄的适配踩坑

前言&#xff1a; 记录一点最近在做手柄适配问题的踩坑。 这里推荐一款Unity做手柄适配的插件->Rewired Rewired官方文档链接Rewired Documentation | Supported Controllers Rewired插件里面有个是Player类&#xff0c;这个类获取到当前玩家的输入设备&#xff0c;输入…

蓝桥杯双向排序

这里写自定义目录标题 题目分析代码思路 题目分析 n,m都是 1 0 5 10^5 105 &#xff0c;需要将时间复杂度控制在 n log ⁡ n n \log n nlogn以内。 如果有两次连续的前缀操作&#xff0c;由于它们都是降序排列&#xff0c;等价于只做第二次排列&#xff0c;忽略掉第一次。 同…

Python缺失值处理实现

在数据处理相关工作中&#xff0c;读取的数据中常常会有缺失值的情况&#xff0c;为顺利进行后续的操作&#xff0c;需要首先对缺失值进行处理&#xff0c;处理的方式一般为删除或填充&#xff0c;Python中提供了专门的工具包&#xff0c;可以方便地进行实现。读取操作可以由pa…
最新文章