5.toString()、构造方法、垃圾回收、静态变量与静态方法、单例设计模式、内部类

news2024/12/23 22:45:07

文章目录

  • 一、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

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

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

相关文章

基于ssm的教务管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 在高等院校的教学科研活动中,最重要的部门是学校的教务管理部门。教务管理工作是现代高等院校培养人才的核心工作。高校教务工作具有一个很明显的特征,就是围绕着学生为中心,以学生作为管理对…

ROS2-Jazzy(一):让小乌龟跑起来

配置ROS2 ros为了使一个系统中可以存在多个不同版本的ros,将ros的配置指令写成了脚本,要用ros前根据自己所需要执行对应的脚本 source /opt/ros/jazzy/setup.zsh如果你只用一个版本的ros,可以将执行脚本的指令写到对应shell的配置文件里&am…

STM32 ADC学习日记

STM32 ADC学习日记 1. ADC简介 ADC 即模拟数字转换器,英文详称 Analog-to-digital converter,可以将外部的模拟信号转换为数字信号。 STM32F103 系列芯片拥有 3 个 ADC(C8T6 只有 2 个),这些 ADC 可以独立使用&…

10.9 Qt事件处理机制

键盘按键调整label移动 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QKeyEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);}Widget::~Widget() {delete ui;…

解决新版Android studio不能连接手机的问题

我要说的是一个特例&#xff0c;装了22年的版本AS可以正常连接手机&#xff0c;装了23年以后新版本&#xff0c;AS不能正常连接手机了&#xff0c;但是在CMD控制台可以正常的执行adb命令&#xff0c;并且CMD和AS都是指向D:\android_sdk\platform-tools\adb.exe 一、 为什么会出…

【万字长文】Word2Vec计算详解(二)Skip-gram模型

【万字长文】Word2Vec计算详解&#xff08;二&#xff09;Skip-gram模型 写在前面 本篇介绍Word2Vec中的第二个模型Skip-gram模型 【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解&#xff08;二&#xff09;S…

HCIA——one

推荐电影&#xff1a;《模仿游戏》《黑客帝国》《头号玩家》 图灵机每秒五千次计算&#xff0c;当今计算机4080ti算力每秒21万亿次的计算。 OSI七层模型 应用层&#xff1a;人机交互&#xff0c;将抽象语言转换成编码 表示层&#xff1a;将编码转换成二进制 介质访问控制层…

Vue3 + TypeScript + Vite + Echarts + DataV

Vue3 TypeScript Vite Echarts DataV 官网&#xff1a; datav datav-vue3 1、创建工程 npm create vitelatestcd datav-app npm install npm run dev2、安装项目依赖模块 npm install types/node --save-devnpm install vue-router4npm install animate.css --save npm i…

【093】基于SpringBoot+Vue实现的精品水果线上销售系统

系统介绍 视频演示 基于SpringBootVue实现的精品水果线上销售系统&#xff08;有文档&#xff09; 基于SpringBootVue实现的精品水果线上销售系统采用前后端分离的架构方式&#xff0c;系统设计了管理员、商家、用户三种角色&#xff0c;实现了公告类型管理、商家信誉类型管理…

网络编程(16)——asio多线程模型IOServicePool

目录 十六、day16 1. 什么是多线程&#xff1f; 2. IOServicePool实现 3. 服务器修改 4. 客户端修改 5. 总结 1. boost::asio::io_context::work的作用&#xff1f; 十六、day16 在之前的设计中&#xff0c;我们对 ASIO 的使用都是采用单线程模式。为了提升网络 I/O 并…

基于多能互补的热电联供型微网优化运行【matlab代码】

目录 1 主要内容 多能互补模型 算例分析 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序基本复现《基于多能互补的热电联供型微网优化运行》&#xff0c;在需求侧对负荷类型进行分类&#xff0c;利用电负荷的弹性和系统供热方式的多样性&#xff0c;构建含电负荷时…

常见的图像处理算法:中值滤波----median filter

一、中值滤波是什么 中值滤波法是一种非线性平滑技术&#xff0c;可用于消除孤立的噪声点。中值滤波在滤除噪声的同时&#xff0c;能够保护信号的边缘&#xff0c;使之不被模糊&#xff0c;这些特性是线性滤波方法所不具有的。 二、中值滤波的原理 中值滤波是将每一像素点的灰度…

数据结构进阶:二叉搜索树_C++

目录 前言&#xff1a; 一、二叉搜索树 1.1二叉搜索树概念 2.2 二叉搜索树操作 1. 二叉搜索树的插入 1.1、插入过程 1.2、代码实现 2、二叉树的删除 2.1、结点删除情况 2.2、替换删除法 1、替换思路 2、代码实现&#xff1a; 3、二叉搜索树的查找 3.1、查找规则 …

LLM - 配置 GraphRAG + Ollama 服务 构建 中文知识图谱

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142795151 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 GraphR…

基于springboot的公司财务管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的公司财务管理系统拥有两种角色 管理员&#xff1a;员工管理、部门管理、工资管理、资产管理、经营管理、利润管理等 员工&#xff1a;查看工资、查看公告、登录注册 1.…

OurTV 3.3.0 |流畅电视直播,收藏无忧

OurTV 是一款流畅的电视直播应用&#xff0c;支持电视版和手机版。增加收藏功能&#xff0c;修正了网络问题和潜在内存泄漏&#xff0c;调整最小版本到22&#xff0c;观看体验更佳。 大小&#xff1a;34M 百度网盘&#xff1a;https://pan.baidu.com/s/1UqEBfQx_1ztIUNx4fWopu…

《神经网络》—— 长短期记忆网络(Long Short-Term Memory,LSTM)

文章目录 一、LSTM的简单介绍二、 LSTM的核心组件三、 LSTM的优势四、 应用场景 一、LSTM的简单介绍 传统RNN循环神经网络的局限&#xff1a; 示例&#xff1a;当出现“我的职业是程序员。。。。。。我最擅长的是电脑”。当需要预测最后的词“电脑”。当前的信息建议下一个词可…

iOS Object-C 将数组倒置(倒叙)

使用NSArray自带的对象方法:reverseObjectEnumerator 代码如下: NSArray * tempArray [[NSArray alloc]initWithObjects:"a","b","c","d", nil]; //将tempArray转换成["d","c","b","a"]; …

PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(四)

无论100个表还是30个表&#xff0c;在使用PasteForm模式的时候&#xff0c;管理端的页面是一样的&#xff0c;大概4个页面&#xff0c; 利用不同操作模式下的不同dto数据模型&#xff0c;通过后端修改对应的dto可以做到控制前端的UI&#xff0c;在没有特别特殊的需求下可以做到…

【光追模组】雷神之锤4光追mod,调色并修改光影,并且支持光追效果,游戏画质大提升

大家好&#xff0c;今天小编我给大家继续引入一款游戏mod&#xff0c;这次这个模组主要是针对雷神之锤4进行修改&#xff0c;如果你觉得游戏本身光影有缺陷&#xff0c;觉得游戏色彩有点失真的话&#xff0c;或者说你想让雷神之锤4这款游戏增加对光线追踪的支持的话&#xff0c…