【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。

简介: 本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要

 目录

一、toString() 方法是啥?

(一)默认的 toString() 方法

(二)toString() 方法的作用

二、为啥要重写 toString() 方法?

(一)提高代码的可读性

(二)方便调试

三、如何重写 toString() 方法?

(一)重写的规则

(二)代码示例

四、toString() 方法重写的最佳实践

(一)包含关键属性信息

(二)保持格式的一致性和简洁性

(三)考虑对象的嵌套关系

五、toString() 方法与其他方法的配合使用

(一)与 equals() 和 hashCode() 方法的关系

(二)在日志记录中的应用

image.gif 编辑

宝子们,今天咱要好好唠唠 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);
    }
}

image.gif

在这个例子中,如果我们没有重写 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() 方法
    @Override
    public 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);
    }
}

image.gif

在这个例子中,我们重写了 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;
    }
    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", position='" + position + '\'' +
                ", department='" + department + '\'' +
                '}';
    }
}

image.gif

(二)保持格式的一致性和简洁性

  • 一致性:如果一个项目中有多个类都重写了 toString() 方法,尽量保持格式的一致,这样在查看不同对象的信息时,能够更加清晰地进行对比和分析。例如,都采用 “类名 {属性 1 = 值 1, 属性 2 = 值 2,...}” 这样的格式,让开发者能够快速适应和理解每个类的 toString() 方法返回的信息结构。
  • 简洁性:不要在 toString() 方法中返回过于复杂或者冗长的字符串,要突出重点,只包含必要的属性信息。避免在方法中进行复杂的计算或者逻辑处理,因为 toString() 方法的主要目的是提供对象的简要信息,而不是执行复杂的业务逻辑。

(三)考虑对象的嵌套关系

如果一个对象中包含其他对象作为属性,比如一个 Order 类中包含多个 Item 对象(代表订单中的商品项),在重写 Order 类的 toString() 方法时,要考虑如何合理地展示这些嵌套对象的信息。可以采用简洁的方式,比如只显示每个 Item 对象的关键信息(如商品名称和数量),或者提供一个方法让用户可以进一步查看 Item 对象的详细信息,而不是在 OrdertoString() 方法中展开所有的嵌套对象细节,导致字符串过于复杂难以阅读。

class Item {
    private String name;
    private int quantity;
    public Item(String name, int quantity) {
        this.name = name;
        this.quantity = quantity;
    }
    @Override
    public String toString() {
        return "Item{" +
                "name='" + name + '\'' +
                ", quantity=" + quantity +
                '}';
    }
}
class Order {
    private List<Item> items;
    public Order(List<Item> items) {
        this.items = items;
    }
    @Override
    public 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();
    }
}

image.gif

在这个例子中,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;
    }
    @Override
    public 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);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

image.gif

(二)在日志记录中的应用

在进行日志记录时,toString() 方法可以与日志框架(如 Log4jSlf4j 等)配合使用,方便地记录对象的详细信息。例如:

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);
    }
}

image.gif

在这个例子中,当我们使用日志框架记录 Person 对象时,toString() 方法会被自动调用,将对象的信息以一种可读的方式记录到日志中,方便后续查看和分析程序的运行状态。

宝子们,toString() 方法的重写虽然看起来不是很难,但在实际的 Java 编程中却有着重要的作用,能够大大提高我们代码的可读性、调试效率以及与其他方法和框架的配合效果。希望通过这篇文章,大家都能掌握 toString() 方法重写的技巧和最佳实践,写出更加优秀的 Java 代码。如果在学习过程中还有什么疑问或者想要深入探讨的地方,随时回来看看这篇文章,或者查阅更多的相关资料哦。

image.gif 编辑


相关文章
|
13天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
171328 12
|
15天前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150294 32
|
23天前
|
弹性计算 人工智能 安全
对话 | ECS如何构筑企业上云的第一道安全防线
随着中小企业加速上云,数据泄露、网络攻击等安全威胁日益严重。阿里云推出深度访谈栏目,汇聚产品技术专家,探讨云上安全问题及应对策略。首期节目聚焦ECS安全性,提出三道防线:数据安全、网络安全和身份认证与权限管理,确保用户在云端的数据主权和业务稳定。此外,阿里云还推出了“ECS 99套餐”,以高性价比提供全面的安全保障,帮助中小企业安全上云。
201959 14
对话 | ECS如何构筑企业上云的第一道安全防线
|
5天前
|
存储 人工智能 安全
对话|无影如何助力企业构建办公安全防护体系
阿里云无影助力企业构建办公安全防护体系
1251 8
|
1天前
|
机器学习/深度学习 自然语言处理 PyTorch
深入剖析Transformer架构中的多头注意力机制
多头注意力机制(Multi-Head Attention)是Transformer模型中的核心组件,通过并行运行多个独立的注意力机制,捕捉输入序列中不同子空间的语义关联。每个“头”独立处理Query、Key和Value矩阵,经过缩放点积注意力运算后,所有头的输出被拼接并通过线性层融合,最终生成更全面的表示。多头注意力不仅增强了模型对复杂依赖关系的理解,还在自然语言处理任务如机器翻译和阅读理解中表现出色。通过多头自注意力机制,模型在同一序列内部进行多角度的注意力计算,进一步提升了表达能力和泛化性能。
|
6天前
|
人工智能 自然语言处理 程序员
通义灵码2.0全新升级,AI程序员全面开放使用
通义灵码2.0来了,成为全球首个同时上线JetBrains和VSCode的AI 程序员产品!立即下载更新最新插件使用。
1260 23
|
8天前
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
|
6天前
|
消息中间件 人工智能 运维
1月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
506 21
1月更文特别场——寻找用云高手,分享云&AI实践
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
|
11天前
|
人工智能 自然语言处理 API
阿里云百炼xWaytoAGI共学课DAY1 - 必须了解的企业级AI应用开发知识点
本课程旨在介绍阿里云百炼大模型平台的核心功能和应用场景,帮助开发者和技术小白快速上手,体验AI的强大能力,并探索企业级AI应用开发的可能性。

热门文章

最新文章