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

自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)

自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)

  • 一、final关键字
    • 1、认识final关键字
    • 2、final修饰变量的注意
    • 3、常量
  • 二、单例类(设计模式)
    • 1、设计模式的概念
    • 2、单例设计模式
    • 3、单例类有很多形式
    • 4、懒汉式单例类
    • 5、小结
  • 三、枚举类
    • 1、认识枚举类
    • 2、枚举类的常见应用场景
  • 四、抽象类
    • 1、认识抽象类
      • 1、抽象类的注意事项、特点
      • 2、小结
    • 2、使用抽象类的好处
      • 小结
    • 3、模板方法设计模式
      • 小结
  • 五、接口
    • 1、接口的概述
      • 小结
    • 2、接口好处
    • 3、接口的综合小案例
    • 4、JDK8开始,接口新增的三种方法
      • 小结
    • 5、接口的注意事项
    • 6、综合案例

一、final关键字

1、认识final关键字

final关键字是最终的意思,可以修饰:类、方法、变量。
∙ \bullet 修饰类:该类被称为最终类,特点是不能被继承了。
∙ \bullet 修饰方法:该方法被称为最终方法,特点是不能被重写。
∙ \bullet 修饰变量:该变量有且仅能被赋值一次。

2、final修饰变量的注意

∙ \bullet final修饰基本类型的变量,变量存储的数据不能被改变。
∙ \bullet final修饰引用类型的变量,变量存储的地址不能被改变,但地址所指向对象的内容是可以被改变的。

3、常量

在这里插入图片描述
在这里插入图片描述

二、单例类(设计模式)

1、设计模式的概念

∙ \bullet 一个问题通常由n钟解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式
∙ \bullet 设计模式有20多种,对应20多种软件开发中会遇到的问题。

2、单例设计模式

∙ \bullet 作用:确保某个类只能创建一个对象。
在这里插入图片描述
写法,实现步骤:

∙ \bullet 把类的构造器私有。
∙ \bullet 定义一个类变量记住类的一个对象。
∙ \bullet 定义一个类方法,返回对象。
在这里插入图片描述

3、单例类有很多形式

∙ \bullet 饿汉式单例:拿对象时,对象早就创建好了。
∙ \bullet 懒汉式单例:拿对象时,才开始创建对象。

4、懒汉式单例类

∙ \bullet 用对象时,才开始创建对象。
写法:
∙ \bullet 把类的构造器私有。
∙ \bullet 定义一个静态变量用于存储对象。
∙ \bullet 提供一个静态方法,保证返回的是同一个对象。
在这里插入图片描述

5、小结

在这里插入图片描述
在这里插入图片描述

三、枚举类

1、认识枚举类

∙ \bullet 枚举类是一种特殊类。
枚举类的写法:
在这里插入图片描述
在这里插入图片描述
特点:
∙ \bullet 枚举类中的第一行,只能写枚举类的对象名称,且要用逗号隔开。
∙ \bullet 这些名称,本质是常量,每个常量都记住了枚举类的一个对象。
在这里插入图片描述
在这里插入图片描述

2、枚举类的常见应用场景

∙ \bullet 枚举类很适合做信息分类和标志。
在这里插入图片描述

四、抽象类

1、认识抽象类

∙ \bullet 在Java中有一个关键字叫:abstract,它就是抽象类的意思,可以用它修饰类、成员方法。
∙ \bullet abstract修饰类,这个就是抽象类。
∙ \bullet abstract修饰方法,这个方法就是抽象方法。
在这里插入图片描述

1、抽象类的注意事项、特点

∙ \bullet 抽象类中不一定要有抽象方法,有抽象方法的类必须是抽象类。
∙ \bullet 类有的成员:成员变量、方法、构造器,抽象类都可以有。
∙ \bullet 抽象类最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
∙ \bullet 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

2、小结

在这里插入图片描述

2、使用抽象类的好处

∙ \bullet 父类知道每个子类都要做某个行为,但是每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。
在这里插入图片描述

小结

在这里插入图片描述

3、模板方法设计模式

∙ \bullet 提供一个方法作为完成某类功能的模板,模板方法封装了每个实现步骤,但允许子类提供特定步骤的实现。
∙ \bullet 模板方法设计模式可以提高代码的复用、并简化子类设计。
在这里插入图片描述
写法
∙ \bullet 1、定义一个抽象类。
∙ \bullet 2、在里面定义2个方法
①一个是模板方法:把共同的实现步骤放里面去。
②一个是抽象方法:不确定的实现步骤,交给具体的子类来完成。

多学一招
建议使用final关键字修饰模板方法,为什么?
∙ \bullet 模板方法是给子类直接使用的,不能被子类重写。
∙ \bullet 一旦子类重写了模板方法,模板方法就失效了。

小结

在这里插入图片描述

五、接口

1、接口的概述

∙ \bullet Java提供了一个关键字interface定义接口。
在这里插入图片描述
∙ \bullet 注意:接口不能创建对象
∙ \bullet 接口是用来被类实现(implements)的,实现接口的类称为实现类,一个类可以同时实现多个接口。
在这里插入图片描述

小结

在这里插入图片描述

2、接口好处

∙ \bullet 弥补了类单继承的不足,一个类同时可以实现多个接口,使类的角色更多,功能更强大。
∙ \bullet 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(更利于程序的解耦合)。

3、接口的综合小案例

在这里插入图片描述

4、JDK8开始,接口新增的三种方法

在这里插入图片描述
∙ \bullet 增强了接口的能力,更便于项目的扩展和维护。

小结

在这里插入图片描述

5、接口的注意事项

在这里插入图片描述

6、综合案例

在这里插入图片描述

相关文章:

自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)

自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口) 一、final关键字1、认识final关键字2、final修饰变量的注意3、常量 二、单例类(设计模式)1、设计模式的概念2、单例设计模式3、单例类有很多形式4、懒汉式单例类5、小…...

Hutool - Cache:简单而强大的缓存实现

目录 1. 缓存简介 2. 引入依赖 3. 常见缓存类型及使用示例 3.1 FIFO 缓存(先进先出缓存) 3.2 LRU 缓存(最近最少使用缓存) 3.3 定时缓存 4. 缓存的基本操作 5. 总结 1. 缓存简介 在软件开发中,缓存是一种常用的…...

DeepSeek 通过 API 对接第三方客户端 告别“服务器繁忙”

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 上一期分享了如何在本地部署 DeepSeek R1 模型,但通过命令行运行的本地模型,问答的交互也要使用命令行,体验并不是很好。这期分享几个第三方客户端,涵盖了桌…...

Python 基础-循环

目录 简介 break continue 小结 简介 要计算123,我们可以直接写表达式: >>> 1 2 3 6要计算123...10,勉强也能写出来。 但是,要计算123...10000,直接写表达式就不可能了。 为了让计算机能计算成千上…...

Java和SQL测试、性能监控中常用工具

下面我会详细列举一些在Java和SQL测试、调试、性能监控中常用的工具,并结合项目中提到的各个技术点说明如何选择合适的工具和方法。 一、Java项目常用的测试、调试与性能监控工具 单元测试与集成测试:JUnit/TestNG: 用于编写单元测试和集成测…...

SQL 注入攻击详解[基础篇]:Web 应用程序安全漏洞与防御策略

目录 SQL注入的简介 现代 Web 应用程序中的数据库交互与 SQL 注入攻击 数据库管理系统(DBMS)架构与 SQL 注入 什么是 SQL 注入? SQL 注入的工作原理 SQL 注入的用例与影响 如何预防 SQL 注入? 数据库分类 数据库类型&am…...

【ArcGIS Pro二次开发】(87):样式_Style的用法

.Stylx类型的文件即为样式库文件&#xff0c;保存了符号样式。 1、根据名字获取当前工程中的style //获取当前工程中的所有style var ProjectStyles Project.Current.GetItems<StyleProjectItem>();//根据名字找出指定的style StyleProjectItem style ProjectStyles.F…...

DEX-EE三指灵巧手:扩展AI与机器人研究的边界

DEX-EE三指灵巧手&#xff0c;由Shadow Robot与Google DeepMind合作开发&#xff0c;以其先进技术和设计&#xff0c;正在引领AI与机器人研究的新趋势。其高精度传感器和灵活的机械手指&#xff0c;能够捕捉复杂的环境数据&#xff0c;为强化学习实验提供了可靠支持。 Shadow R…...

简站主题:简洁、实用、SEO友好、安全性高和后期易于维护的wordpress主题

简站主题以其简洁的设计风格、实用的功能、优化的SEO性能和高安全性而受到广泛好评。 简洁&#xff1a;简站主题采用扁平化设计风格&#xff0c;界面简洁明了&#xff0c;提供多种布局和颜色方案&#xff0c;适合各种类型的网站&#xff0c;如个人博客和企业网站。 实用&…...

23种设计模式 - 责任链

模式定义 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;允许多个对象按链式顺序处理请求&#xff0c;直到其中一个对象处理为止。该模式将请求的发送者和接收者解耦&#xff0c;使多个对象都有机会处理请求。 模式结构…...

Flink SQL与Doris实时数仓Join实战教程(理论+实例保姆级教程)

目录 第一章:Regular Joins 深度解析 1.1 核心原理与适用场景 1.2 电商订单 - 商品实时关联案例 1.2.1 数据流设计 1.2.2 Doris 表设计优化 1.2.3 性能调优要点 第二章:Interval Joins 实战应用 2.1 时间区间关联原理 2.2 优惠券使用有效性验证 2.2.1 业务场景说明 …...

算法——舞蹈链算法

一&#xff0c;基本概念 算法简介 舞蹈链算法&#xff08;Dancing Links&#xff0c;简称 DLX&#xff09;是一种高效解决精确覆盖问题的算法&#xff0c;实际上是一种数据结构&#xff0c;可以用来实现 X算法&#xff0c;以解决精确覆盖问题。由高德纳&#xff08;Donald E.…...

【复现DeepSeek-R1之Open R1实战】系列6:GRPO源码逐行深度解析(上)

目录 4 GRPO源码分析4.1 数据类 GRPOScriptArguments4.2 系统提示字符串 SYSTEM_PROMPT4.3 奖励函数4.3.1 accuracy_reward函数4.3.2 verify函数4.3.3 format_reward函数 4.4 将数据集格式化为对话形式4.5 初始化GRPO Trainer 【复现DeepSeek-R1之Open R1实战】系列3&#xff1…...

若依Flowable工作流版本监听器使用方法

1.前言 本文详细介绍如何在若依Flowable工作流版本&#xff08;RuoYi-Vue-Flowable&#xff09;中配置执行监听器和任务监听器。是以我二次开发的代码为基础&#xff0c;介绍如何配置监听器&#xff0c;已解决源码在新增或删除监听器出现的问题&#xff0c;如果需要二次开发的…...

机器视觉--图像的运算(乘法)

一、引言 在图像处理领域&#xff0c;Halcon 是一款功能强大且广泛应用的机器视觉软件库。它提供了丰富的算子和工具&#xff0c;能够满足各种复杂的图像处理需求。图像的乘法运算作为其中一种基础操作&#xff0c;虽然不像一些边缘检测、形态学处理等操作那样被频繁提及&…...

突破反爬困境:从服务端渲染到客户端SPA,爬虫环境的演变与新挑战(一)

声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的&#xff0c;旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…...

matlab下载安装图文教程

【matlab介绍】 MATLAB是一款由美国MathWorks公司开发的专业计算软件&#xff0c;主要应用于数值计算、可视化程序设计、交互式程序设计等高科技计算环境。以下是关于MATLAB的简要介绍&#xff1a; MATLAB是MATrix LABoratory&#xff08;矩阵实验室&#xff09;的缩写&#…...

七、敏捷开发工具:持续集成与部署工具

一、敏捷开发工具——持续集成与部署工具 持续集成(CI)与持续部署(CD)是现代敏捷开发中不可或缺的关键实践。通过自动化构建、测试和部署流程,团队可以快速反馈、提高代码质量,并加速产品交付。为此,持续集成与部署工具应运而生,它们能够帮助开发团队在整个开发周期内…...

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…...

2025年新型智慧城市整体解决方案下载:顶层规划设计,应用总体建设方案

一、引言 随着信息技术的飞速发展和城市化进程的加速&#xff0c;智慧城市已成为未来城市发展的新趋势。新型智慧城市通过深度融合物联网、大数据、云计算、人工智能等先进技术&#xff0c;旨在实现城市管理的智能化、精细化和服务的人性化&#xff0c;提升城市治理效能&#…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...