【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
目录
一、toString() 方法是啥?
(一)默认的 toString() 方法
(二)toString() 方法的作用
二、为啥要重写 toString() 方法?
(一)提高代码的可读性
(二)方便调试
三、如何重写 toString() 方法?
(一)重写的规则
(二)代码示例
四、toString() 方法重写的最佳实践
(一)包含关键属性信息
(二)保持格式的一致性和简洁性
(三)考虑对象的嵌套关系
五、toString() 方法与其他方法的配合使用
(一)与 equals() 和 hashCode() 方法的关系
(二)在日志记录中的应用

宝子们,今天咱要好好唠唠 Java 里一个看似不起眼,但实则用处很大的知识点 ——toString() 方法的重写。在 Java 的世界中,当我们想要直观地了解一个对象的信息时,toString() 方法就派上用场了。不过呢,默认的 toString() 方法有时候可能不太能满足我们的需求,这时候就需要对它进行重写啦。
一、toString() 方法是啥?
(一)默认的 toString() 方法
每个 Java 类都默认继承自 java.lang.Object 类,而 Object 类中就有这个 toString() 方法。当我们创建一个对象,然后直接打印这个对象时,实际上调用的就是它的 toString() 方法。比如说:
认真学哦,掌握这些知识,就像看小说一样,你会越来越强大。
class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public static void main(String[] args) {Person person = new Person("张三", 25);// 这里直接打印 person 对象,会调用其 toString() 方法System.out.println(person);}
}
在这个例子中,如果我们没有重写 toString() 方法,打印出来的结果可能是类似 Person@15db9742 这样一串不太好理解的字符串,这其实是对象的默认哈希码表示形式,对于我们了解对象的具体内容没啥太大帮助。
(二)toString() 方法的作用
toString() 方法的主要作用就是返回一个能代表对象状态的字符串。当我们在调试程序或者需要将对象的信息以一种可读的方式展示出来时,它就非常重要了。比如在日志记录中,我们可能需要记录某个对象的详细信息,这时候一个合适的 toString() 方法就能让我们快速了解对象的各个属性值,而不是看到一堆乱码一样的哈希码。
二、为啥要重写 toString() 方法?
(一)提高代码的可读性
想象一下,我们在一个大型项目中,有很多地方都需要打印对象的信息来进行调试或者查看数据的状态。如果不重写 toString() 方法,看到的都是那些默认的哈希码,根本不知道对象里面到底存了些啥数据。但如果我们重写了 toString() 方法,就可以按照我们想要的格式返回对象的属性信息,比如对于一个 Student 对象,我们可以让 toString() 方法返回 “学生姓名:[具体姓名],年龄:[具体年龄],成绩:[具体成绩]” 这样清晰明了的字符串,这对于我们快速了解学生对象的情况就非常方便,大大提高了代码的可读性。
(二)方便调试
在调试程序的时候,我们经常需要查看各种对象的状态,看看数据是否正确地被赋值和修改。如果能够通过重写 toString() 方法,将对象的关键属性信息以一种直观的方式展示出来,那么在调试过程中就能更快地发现问题所在。比如在一个电商系统中,对于一个 Order 对象,重写 toString() 方法返回订单号、商品列表、总价等信息,当出现订单问题时,我们可以很容易地通过打印 Order 对象来查看这些关键信息,从而更快地定位和解决问题。
三、如何重写 toString() 方法?
(一)重写的规则
- 方法签名:必须和
Object类中的toString()方法签名完全一致,也就是public String toString()。这是 Java 重写方法的基本规则,保证了在运行时能够正确地调用子类重写后的方法。- 返回值:返回一个字符串,这个字符串要能够准确地描述对象的状态。通常我们会将对象的各个属性值以一种合理的格式组合成一个字符串返回。
- 访问权限:一般将其声明为
public,这样在任何需要使用该对象的地方都能够方便地调用toString()方法获取对象的信息。
(二)代码示例
class Book {private String title;private String author;private double price;public Book(String title, String author, double price) {this.title = title;this.author = author;this.price = price;}// 重写 toString() 方法@Overridepublic String toString() {return "Book{" +"title='" + title + '\'' +", author='" + author + '\'' +", price=" + price +'}';}public static void main(String[] args) {Book book = new Book("Java 编程思想", "Bruce Eckel", 89.9);// 现在打印 book 对象,会调用重写后的 toString() 方法,输出详细的书籍信息System.out.println(book);}
}
在这个例子中,我们重写了 Book 类的 toString() 方法,将书籍的标题、作者和价格等属性以 “Book {title='[具体标题]', author='[具体作者]', price=[具体价格]}” 的格式返回。这样,当我们打印 Book 对象时,就能清晰地看到书籍的详细信息,而不是那个让人摸不着头脑的默认哈希码。
四、toString() 方法重写的最佳实践
(一)包含关键属性信息
在重写 toString() 方法时,要确保包含对象的关键属性信息,这些信息能够完整地描述对象的状态。比如对于一个 Employee 类,除了员工的姓名、年龄等基本信息外,如果员工还有职位、部门等重要属性,也应该包含在 toString() 方法返回的字符串中,这样才能在查看员工对象信息时全面了解其情况。
class Employee {private String name;private int age;private String position;private String department;public Employee(String name, int age, String position, String department) {this.name = name;this.age = age;this.position = position;this.department = department;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", position='" + position + '\'' +", department='" + department + '\'' +'}';}
}
(二)保持格式的一致性和简洁性
- 一致性:如果一个项目中有多个类都重写了
toString()方法,尽量保持格式的一致,这样在查看不同对象的信息时,能够更加清晰地进行对比和分析。例如,都采用 “类名 {属性 1 = 值 1, 属性 2 = 值 2,...}” 这样的格式,让开发者能够快速适应和理解每个类的toString()方法返回的信息结构。- 简洁性:不要在
toString()方法中返回过于复杂或者冗长的字符串,要突出重点,只包含必要的属性信息。避免在方法中进行复杂的计算或者逻辑处理,因为toString()方法的主要目的是提供对象的简要信息,而不是执行复杂的业务逻辑。
(三)考虑对象的嵌套关系
如果一个对象中包含其他对象作为属性,比如一个 Order 类中包含多个 Item 对象(代表订单中的商品项),在重写 Order 类的 toString() 方法时,要考虑如何合理地展示这些嵌套对象的信息。可以采用简洁的方式,比如只显示每个 Item 对象的关键信息(如商品名称和数量),或者提供一个方法让用户可以进一步查看 Item 对象的详细信息,而不是在 Order 的 toString() 方法中展开所有的嵌套对象细节,导致字符串过于复杂难以阅读。
class Item {private String name;private int quantity;public Item(String name, int quantity) {this.name = name;this.quantity = quantity;}@Overridepublic String toString() {return "Item{" +"name='" + name + '\'' +", quantity=" + quantity +'}';}
}class Order {private List<Item> items;public Order(List<Item> items) {this.items = items;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder("Order{");for (Item item : items) {sb.append(item.toString()).append(", ");}if (sb.length() > "Order{".length()) {sb.setLength(sb.length() - 2);}sb.append('}');return sb.toString();}
}
在这个例子中,Order 类的 toString() 方法通过循环将每个 Item 对象的 toString() 方法返回的字符串连接起来,展示了订单中包含的商品项信息,既简洁又能让用户对订单的内容有一个大致的了解。
五、toString() 方法与其他方法的配合使用
(一)与 equals() 和 hashCode() 方法的关系
在 Java 中,当我们重写 equals() 方法来判断两个对象是否相等时,通常也需要重写 hashCode() 方法,以保证对象在哈希表中的正确存储和查找。而 toString() 方法也可以与这两个方法配合使用,提供更全面的对象比较和信息展示功能。
例如,如果两个 Person 对象的 equals() 方法判断它们的姓名和年龄都相等,那么它们的 hashCode() 方法应该返回相同的值,并且它们的 toString() 方法返回的信息也应该能够反映出这种相等关系,让开发者在调试和查看对象信息时能够更加清晰地理解对象的状态和相等性判断逻辑。
class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass()!= o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
(二)在日志记录中的应用
在进行日志记录时,toString() 方法可以与日志框架(如 Log4j、Slf4j 等)配合使用,方便地记录对象的详细信息。例如:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggingExample {private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);public static void main(String[] args) {Person person = new Person("李四", 30);// 使用日志框架记录 Person 对象的信息,会自动调用 toString() 方法logger.info("创建了新的 Person 对象:{}", person);}
}
在这个例子中,当我们使用日志框架记录 Person 对象时,toString() 方法会被自动调用,将对象的信息以一种可读的方式记录到日志中,方便后续查看和分析程序的运行状态。
宝子们,toString() 方法的重写虽然看起来不是很难,但在实际的 Java 编程中却有着重要的作用,能够大大提高我们代码的可读性、调试效率以及与其他方法和框架的配合效果。希望通过这篇文章,大家都能掌握 toString() 方法重写的技巧和最佳实践,写出更加优秀的 Java 代码。如果在学习过程中还有什么疑问或者想要深入探讨的地方,随时回来看看这篇文章,或者查阅更多的相关资料哦。

相关文章:
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
目录 一、toString() 方法是啥? (一)默认的 toString() 方法 (二)toString() 方法的作用 二、为啥要重写 toString() 方法? (一)提高代码的可读性 (二)…...
【论文笔记】Contrastive Learning for Sign Language Recognition and Translation
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Contrastive Learning for…...
Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)
一、gitlab设置: 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置,选择网络,在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置ÿ…...
一起来看--红黑树
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 红黑树是一种自平衡的二叉搜索树,广泛应用于计算机科学中,尤其是在实现关联数组和集合时。它的设计旨在确保在最坏情况下,基本动态集合操作(如插入、删除和查找&am…...
SpringBoot整合篇 05、Springboot整合Redission
文章目录 前言Redission详细配置步骤pom依赖application.yaml配置类CacheConfigEnvironmentContext RedissionController单测 前言 本篇博客是SpringBoot整合Redission,若文章中出现相关问题,请指出! 所有博客文件目录索引:博客…...
供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇
概述 我们在供应链系统设计-中台系统设计系列(五)- 供应链中台实践概述 中描述了什么是供应链中台,供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解,我会逐一针对中台…...
胡闹厨房练习(三)
ScriptableObject 一、初步了解 1、实质:是一种特殊类型的Unity对象, 2、作用:用于存储大量数据,而不必依附于游戏场景中的某个GameObject。 3、特点: 可以在不增加场景中对象数量的情况下,管理和存储复杂的数据结构、配置信息、游戏状态等。 4、适用:非常适合用来…...
关于ESD(静电放电)等级的划分
关于ESD(静电放电)等级的划分,主要依据不同的测试模型和测试标准。以下是对HBM(人体模型)和CDM(充电器件模型)两种测试模型下ESD等级划分的详细解释: HBM ESD等级划分 HBM ESD等级…...
探究步进电机与输入脉冲的关系
深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容: 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观,我更建议…...
基于YOLOV5+Flask安全帽RTSP视频流实时目标检测
1、背景 在现代工业和建筑行业中,安全始终是首要考虑的因素之一。特别是在施工现场,工人佩戴安全帽是确保人身安全的基本要求。然而,人工监督难免会有疏漏,尤其是在大型工地或复杂环境中,确保每个人都佩戴安全帽变得非…...
Windows内置的服务器IIS(Internet Information Services)托管网站
一. 安装IIS 打开控制面板:在开始菜单搜索“控制面板”并打开它。程序和功能:点击“程序”然后选择“程序和功能”。启用或关闭Windows功能:在左侧菜单中选择“启用或关闭Windows功能”。查找并勾选IIS:在弹出的窗口中,…...
虚幻引擎结构之UObject
一. UObject 的介绍 UObject 是虚幻引擎中的核心基础类,所有其他游戏对象和资源类都直接或间接地继承自它。作为虚幻引擎的基石,UObject 提供了多项关键功能,包括内存管理、序列化、反射(introspection)、垃圾回收以及元数据支持。在虚幻引擎中,UObject 类的实例通常被称…...
js的Reflect对象
Reflect 对象是 JavaScript ES6 中引入的一个内建对象,它提供了一系列与对象操作相关的方法。这些方法与 Object 对象上的方法类似,但在行为上有一些差异,并且更加规范和统一。Reflect 对象并不是一个构造函数,不能被 new 操作符调…...
this指向了谁?
看函数在执行的时候是如何调用的, 1 如果这个函数是用普通函数调用模式来进行调用,它内部的this指向了window; 2 如果一个函数在调用的时候是通过对象方法模式来进行调用,则它内部的this就是我们的对象; 3 如果一个函数在调用的时候通过构…...
基于Resnet、LSTM、Shufflenet及CNN网络的Daily_and_Sports_Activities数据集仿真
在深度学习领域,不同的网络结构设计用于解决特定的问题。本文将详细分析四种主流网络结构:卷积神经网络(CNN)、残差网络(ResNet)、长短期记忆网络(LSTM)和洗牌网络(Shuff…...
mac系统vsCode中使用Better Comments在.vue文件里失效
问题:关于Better Comments默认在html、TS、JS中有效,在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments(注释高亮)在vue文件里失效的问题 关于Better Comments电脑的配置路径: Windows系统&…...
UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化
一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作,APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...
一起学Git【第六节:查看版本差异】
git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…...
numpy np.newaxis介绍
np.newaxis 是 NumPy 中用于增加数组维度的关键字。它的作用是为数组插入一个新的维度,从而改变数组的形状(shape)。 基本用法 np.newaxis 等价于 None,可以作为索引使用,用于在指定位置增加一个维度。增加的维度的大…...
小程序配置文件 —— 16 项目配置文件和配置 sass
目录 项目配置文件配置 sass 项目配置文件 在创建项目的时候,每个项目的根目录生成两个 config.json 文件(project.config.json 和 project.private.config.json ),用于保存开发者在工具上做的个性化配置,例如和编译有…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
ubuntu清理垃圾
windows和ubuntu 双系统,ubuntu 150GB,开发用,基本不装太多软件。但是磁盘基本用完。 1、查看home目录 sudo du -h -d 1 $HOME | grep -v K 上面的命令查看$HOME一级目录大小,发现 .cache 有26GB,.local 有几个GB&am…...
联邦学习带宽资源分配
带宽资源分配是指在网络中如何合理分配有限的带宽资源,以满足各个通信任务和用户的需求,尤其是在多用户共享带宽的情况下,如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源,通常指的是单位时间…...
mq安装新版-3.13.7的安装
一、下载包,上传到服务器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安装 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置环境变量,直接就安装了。 erl…...
MySQL用户远程访问权限设置
mysql相关指令 一. MySQL给用户添加远程访问权限1. 创建或者修改用户权限方法一:创建用户并授予远程访问权限方法二:修改现有用户的访问限制方法三:授予特定数据库的特定权限 2. 修改 MySQL 配置文件3. 安全最佳实践4. 测试远程连接5. 撤销权…...
