5.toString()、构造方法、垃圾回收、静态变量与静态方法、单例设计模式、内部类
文章目录
- 一、toString()
- 1. 优缺点
- 2. 使用方法举例
- ① Dos类里
- 更省事的方法
- ② Application里
- 二、构造方法
- 1. 导入
- 2. 什么是构造方法
- 3. 怎么写构造方法
- ① 无参的构造方法(无参构造器)
- ② 有参的构造方法(有参构造器)
- ③ 注意
- 4. 构造方法的重载
- 三、再探this
- 1. 给成员变量用
- 2. 给方法用
- 四、垃圾回收
- 五、静态变量和静态方法
- 1. 静态变量
- ① 情境
- ② 引出静态变量(static修饰的成员变量)
- ③ 究竟怎么用(加上public)
- ④ 小结
- 2. 静态方法
- ① 情境
- ② 怎么写
- ③ 小结
- 3. private static
- ① 情境
- ② 怎么写
- 问题
- 解决方案
- ③ 小结(涵盖static好处)
- 六、静态代码块
- 七、static单例模式
- 1. 概念
- 2. 举例理解
- 举例:当前类中new自己
- 3. 小结
- 八、内部类
- 1. 分类
- 2. 举例理解
- ① 一个类里再写一个类
- ② 一个文件里写2个类
- ③ 内部类可以调用同文件类里的属性
- ④ 方法内部类
- 九、内容出处
一、toString()
情境:张大爷说我现在想看看我家狗的全部信息,你给我查查。
你一查出现了这玩意(@135fbaa4是指针对象地址)。这个时候该怎么办呢?用toString()
1. 优缺点
优点:可以输出当前某个实例的全部信息
缺点:可能会消耗性能
2. 使用方法举例
① Dos类里
给这个类里所有的成员变量生成toString()方法。
步骤:alt + insert -> toString() -> 全选 -> 回车
@Override是重写注解
更省事的方法
直接在类前面加一个@ToString注解就可以了(前提:安装过lombok了)
补充:
@Data注解可以直接代替 equal()、hashCode()、toString() (前提:安装过lombok了)
② Application里
直接 实例.toString() 就可以输出当前实例的全部信息
二、构造方法
1. 导入
我们都知道假如现在有1、2、3、4四个数字,我们想把它们存到一个数组里的话一共有两种方式:① 初始化数组 ② 先定义后赋值
2. 什么是构造方法
可以帮助我们初始化实例的手段。可以类比着数组那个例子理解。
最初的时候,张大爷他们是不是都是先注册了一个账号,然后才去补充姓名、年龄这些资料。但是实际情况是,我们在注册软件的过程中往往就会被要求填写一些信息,例如:手机号。这个该怎么实现呢?就是说我现在想让用户在注册账号的时候就填写一下昵称(狗的名字)等信息? — 这就用到了构造方法
3. 怎么写构造方法
注意:构造方法不要写返回值类型
构造器的最终目的:初始化对象(实例)
① 无参的构造方法(无参构造器)
② 有参的构造方法(有参构造器)
步骤:alt + insert -> Constructor -> 选择几个都可以(我这里全选了) -> 回车
这样一来,我们就可以让用户在注册时就输入一些信息了。
③ 注意
① 一旦我们自己写了一个构造器,不管传几个参数,都一定要把无参的再重新写一遍。这非常重要
② 问:为什么之前不写构造方法,Dogs zhangDog = new Dogs()也可以创建实例?
答:因为在创建一个类的时候,系统会默认给我们写了一个空参的构造方法,只不过我们看不到。默认创建,隐藏的,只要创建类,就会存在。–无参数构造函数(无参构造器)
4. 构造方法的重载
重载(方法名相同,参数个数或类型不同)。构造方法的重载就是说可以设置多个同名的构造方法,参数任意选择,用到哪个选哪个。这样就不需要定义很多不同方法了,进一步体现了面向对象的好处。
例如:
三、再探this
1. 给成员变量用
this指的是当前实例。
this.name就是当前实例的name属性。
后面那个name是传过来的参数。
this去掉以后代码不会报错,但是会发现参数没传过去。
2. 给方法用
例如:
张大爷的狗吃着吃着睡着了,边吃边睡(虽然可能有的不合理,但是凑合着理解吧)。在eat()方法里调用sleep()函数。
此处省略this.也没什么影响。这里的this指的是当前实例。
四、垃圾回收
情境:如果张大爷不愿意要这个帐号了,我们确实可以直接让zhangDog = null。但是这种写法并不能把它占用的内存空间真正释放掉。那怎么办呢?用System.gc();
但是一般情况而言,手动释放的情况不多,我们了解即可。java中有一个垃圾回收机制(c和c++没有这个说法),是按虚拟机来的,如果没有垃圾回收机制,java的内存占用简直是非常恐怖。
垃圾回收机制的几个相关问题
五、静态变量和静态方法
1. 静态变量
① 情境
假设你的程序火了,有天居委会的负责人来找你,问你能不能让小区名字也出现在程序里,顺便宣传一下我们小区。
我们可以想一下,我们这个程序本来就是给NanG(南瓜)小区里的所有宠物狗设计的,这些狗肯定都是同一个小区的。
下面这种写法虽然不会报错,但是我们想想是不是该小区所有狗的小区名都是NanG啊。NanG是所有狗共享的,不是说张大爷家狗的小区名叫NanG,王阿姨家狗的小区名就成Apple了。所以将小区和姓名、年龄这些差异较大的属性用同一种方式定义显然不太合理。
② 引出静态变量(static修饰的成员变量)
那怎么办呢?用static把小区名这个属性定义成静态变量
但是我们发现,无论直接用toString()方法直接输出该实例的全部信息还是用实例名.属性的方式,都不能得到NanG这个属性值。
为什么呢?因小区名这个属性是属于小区里所有的狗的,不是单属于某条狗的。它已经不属于对象层面了,而是上升到了类的层面
改成 类名.属性也不行,根本找不到plot这个属性。
③ 究竟怎么用(加上public)
在static String plot = "NanG"前面加上public。这个时候我们就会发现public还是挺有用的。
这样就可以用了。而且我们可以发现就算没有用户,也能输出小区名。因为这个小区这个静态属性本来就已经脱离了对象这个层面。
④ 小结
① 静态变量(属性):用 static 修饰的成员变量。用的时候记得加上public。
② 使用方式:类名.静态属性
③ 静态变量已经脱离了对象的层面,上升到了类的层面。
2. 静态方法
① 情境
假设小区3月31号要给所有的狗打疫苗,所有的狗都需要参加。这个时候我们也是从类的层面考虑这个问题,因此打针这个方法我们也要定义成静态的,而且要用public修饰。
② 怎么写
我们可以发现,就算这时候没有用户,通知也能正常发出来。
③ 小结
① 静态方法:用static修饰的方法,而且前面需要加上public
② 使用方法:类名.静态方法
③ 静态方法也是在类这个层面的,与对象关系不大。
3. private static
① 情境
最开始我们是这样定义的。但是现在突然出现了一个问题,我们发现有个黑客轻轻松松就把我们的小区名给改了。怎么办到的呢?
因此,为了安全起见,还是需要将public改成private
② 怎么写
问题
我们可以发现,改完以后没法类名.属性 这样用了。那怎么办呢?有人说提供一个get方法
还是不行。还有什么办法?创建一个实例用 对象.属性 的方式操作
这样虽然不报错,但是也不出结果。而且用对象操作就失去了static的意义了,我们想直接用类名调用。怎么办呢?返回值类型前面加一个static试试。
不行。
解决方案
返回值类型前面加上static以后,再把return this.plot = plot,改成 return plot;
这个时候不管是对象.属性还是类名.属性都行了。但是说实话没必要用对象这种方式。
除此之外,外面的人也没办法随意更改小区名了,安全性也得到了保障。
③ 小结(涵盖static好处)
① 用private static修饰共享的成员变量,并且只提供一个对外的获取方法,我们一旦定义好,用户就不可以再修改了,可以提高程序的安全性
② 与之对应的get方法:返回值类型用static修饰;直接return 共享成员变量 即可
③ 使用方法:类名.方法名
④ static好处:我们可以直接使用类名调用某个实例的属性(例如:张大爷家狗的名)和公共属性(例如:小区名),完全不需要依赖于对象(它是建立在class类上面生成的,和对象根本就没关系)。而且加入private性质以后,还可以在一定程度上保证程序的安全性。
六、静态代码块
① static包着的代码块叫静态代码块,类加载时会先加载静态代码块,而且只会加载一次。
② 用途不太多,所以看看书上代码就行
七、static单例模式
1. 概念
单例设计模式:用static变量返回一个类值,保证这个类只能有一次new的机会,而且不提供对外new的方法,我们只提供被外获取的方法
设计模式之禅 - 单例模式
2. 举例理解
世界上是不是只有一个地球,但是你看现在,直接就能创建2个。这是不是不合理啊?
那怎么办呢?用静态解决这个问题
这个时候用户就不能自己new一个地球了,只能获取地球这个实例。
检测一下能否正常调用。
举例:当前类中new自己
可以这样直接在类里面定义自己,不一定非得要在其它类里用main函数调用。
3. 小结
综上,static单例模式不仅保证了用户可以正常调用其它类,而且还保证了逻辑上的合理性(只有一个地球)。
八、内部类
实际开发过程当中不会特别常用。因为为了方便后期维护,我们总是会把一个类单独写一个文件。例如:该案例中Dogs和Earth都是单独创建的文件。
内部类不好维护。这部分知识看书上案例,懂这个原理就行,不常用。
匿名内部类可能会用到,但是内部类很少用。
c语言中有个匿名结构体
1. 分类
① 一个类里再写一个类
② 一个文件里写2个类
注意:一个文件里只能有一个公共的类。
2. 举例理解
① 一个类里再写一个类
只写class Sun虽然不会报错,但是会发现外部无法访问。一定要加上public static,这样外部才能访问。这里的Sun是一个静态内部类。
上述图片就是把public static去掉的结果。
② 一个文件里写2个类
定义成class Moon不会报错,但是只有加了public才能被外部调用。然而,一个文件里只能有一个公共的类。
③ 内部类可以调用同文件类里的属性
但是如图所示,静态内部类只能调用静态属性。
④ 方法内部类
但是这个Star类只能在这个eat方法里用,意义不大。
九、内容出处
java
相关文章:

5.toString()、构造方法、垃圾回收、静态变量与静态方法、单例设计模式、内部类
文章目录 一、toString()1. 优缺点2. 使用方法举例① Dos类里更省事的方法 ② Application里 二、构造方法1. 导入2. 什么是构造方法3. 怎么写构造方法① 无参的构造方法(无参构造器)② 有参的构造方法(有参构造器)③ 注意 4. 构造方法的重载 三、再探this1. 给成员变量用2. 给…...

Fiddler配合wireshark解密ssl
环境: win11(wireshark)--虚拟机win7(Fiddler)---虚拟机win7(HTTPS站点) 软件安装问题: 需要.net环境,NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…...

【UI】将 naive ui 的 message 封装进axios 中,关于naiveui的message相关的用法
文章目录 前言在setup外进行使用直接包裹使用vue 单文件中使用 参考文章: 关于naiveui的message相关的用法 前言 最近新建了一个vite vu3 的项目,完全是从0 到1 ,封装到request 的时候 想对axios 请求做一个全局的处理,但发现…...

IC卡批量加密快速写入
我们常用的非接触式IC卡,简称M1卡,他有16个扇区,每个扇区有A密码和B密码 对数据的读写是要验证密码的,因此卡片正式使用前,需要把卡片密码改成需要的密码,系统才可以识别 由于一次加密卡片数量比较大&#…...

软件测试学习笔记丨tcpdump 与 wireshark
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32333 一、抓包分析TCP协议 1.1 简介 TCP协议是在传输层中,一种面向连接的、可靠的、基于字节流的传输层通信协议。 1.2 环境准备 对接口测试工具进行分类: 网络嗅…...

Redis:分布式 - 哨兵
Redis:分布式 - 哨兵 概念哨兵 Docker 搭建哨兵分布式选举流程 概念 Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一定规模…...

开源城市运动预约的工具类小程序源码
运动场馆预约小程序是一款主要针对城市运动预约的工具类程序, 产品主要服务人群为20-45岁运动爱好者, 程序前后端完整代码,包括场馆动态,运动常识,羽毛球场地预约,足球场地预约,篮球场地预约&a…...

SldWorks问题 2. 矩阵相关接口使用上的失误
问题 在计算三维点在图纸(DrawingDoc)中的位置时,就是算不对,明明就4、5行代码,怎么看都是很“哇塞”的,毫无问题的。 但结果就是不对。 那就调试一下吧,调试后发现生成的矩阵很不对劲&#…...

2024十月超全大模型常见面试题(附答案)
大模型相关的面试问题通常涉及模型的原理、应用、优化以及面试者对于该领域的理解和经验。以下是一些常见的大模型面试问题以及建议的回答方式: 请简述什么是大模型,以及它与传统模型的主要区别是什么? 回答:大模型通常指的是参…...

Java 的数据结构整理(整合版)
Java 的数据结构整理(整合版) 一、数据输入输出 https://www.runoob.com/java/java-scanner-class.html 这部分是为了预防 leetcode 刷习惯了,忘记怎么处理输入输出的问题 数据输入 Java的数据输入和 C 相比非常繁琐,因此大多…...

如何让信息学奥赛学习“边玩边学”?——趣味编程让枯燥学习变得有趣
信息学奥赛(NOI)作为一项高水平的编程竞赛,内容涉及到大量的算法、数据结构和复杂的逻辑思维,对学生的要求非常高。然而,面对枯燥的知识点和高难度的题目,很多学生在备赛过程中容易感到乏味甚至放弃。那么&…...
【艾思科蓝】C++游戏开发探秘:打造高性能游戏世界的钥匙
【IEEE出版 | 院士、Fellow报告】第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看:学术会议-学术交流征稿-学术会议在线-艾思科蓝 引言 在当今的游戏开发领域,C以其高效、…...

企业如何做好数据安全防泄密?10个你不知道的防泄密措施
随着数字化转型的加速推进,企业在处理和存储大量数据时,数据泄密风险也显著增加。从客户资料到商业机密,敏感数据一旦泄露,可能对企业造成不可估量的损失。为了更好地应对这一挑战,企业需要采取全面的防泄密策略。以下…...

MySQL基本操作(1)
初始数据库 数据库的基本概念 数据库是一个按照数据结构来组织、存储和管理数据的仓库,换句话说,就是存储数据的仓库。 为何使用数据库?使用数据库不仅仅为了使数据持久化,还能使得数据能够进行有效的管理,以…...

Python 如何使用 Redis 作为缓存
Python 如何使用 Redis 作为缓存 一、引言 在现代 Web 应用程序和数据密集型服务中,性能 和 响应速度 是至关重要的因素。而当应用需要频繁访问相同的数据时,直接从数据库获取数据会耗费大量的时间和资源。因此,缓存系统成为了提升性能的重…...
Python知识点:基于Python工具,如何使用Mediapipe进行人体姿态估计
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 基于Python的Mediapipe人体姿态估计技术详解 在计算机视觉领域,人体…...

数据结构进阶:二叉搜索树_C++
目录 前言: 一、二叉搜索树 1.1二叉搜索树概念 2.2 二叉搜索树操作 1. 二叉搜索树的插入 1.1、插入过程 1.2、代码实现 2、二叉树的删除 2.1、结点删除情况 2.2、替换删除法 1、替换思路 2、代码实现: 3、二叉搜索树的查找 3.1、查找规则 …...
uni-app之旅-day04-商品列表
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言6. 商品列表6.0 创建 goodslist 分支6.1 定义请求参数对象6.2 获取商品列表数据6.3 渲染商品列表结构6.4 把商品 item 项封装为自定义组件在 goods_detail 组件…...
单元测试的定义
概念 单元测试是对软件中的最小可测试单元进行检查和验证的过程。在面向对象编程中,最小可测试单元通常是一个方法或者一个类。它的目的是隔离各个部分的代码,确保每个单元都能按预期工作,从而提高软件的质量和可维护性。重要性 发现早期错误…...
C语言从头学66—学习头文件 <stdio.h>(二)
关于可变参数,我们曾经在《C语言从头学27》中接触过,下面学习能够接收可变参数作为 参数的几个函数。 一、printf函数的能够接收可变参数的变体函数: 1、函数vprintf() 功能:按照给定格式,将可变参数中的内容输…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...