Java基础知识点之toString方法详解

  学习过Java SE的人应该都知道,每一个我们所编写的类都有toString方法,因为在Java中所有的类都默认继承根类Object,而Object本身就有toString方法。

  简单来说,如果子类不重写toString方法,那么默认它的返回值为:全类名+@+哈希值的十六进制,此处的全类名指的是包名+类名,而@仅仅只是一个符号而已,没有什么特殊含义,哈希值的十六进制,固然,显示的是一个十六进制数,有基础的小伙伴应该知道hashCode方法返回的哈希值是十进制int类型的数据。口说无凭,我们可以打开JDK的源码来进行验证,如下图所示:

  getClass方法得到的是class + 全类名,通过如下代码可以验证出来:

  getClass方法得到的对象再去调用getName方法,那么得到的就是全类名了,class就不见了,如下图所示:

  通过观察toString的源码,我们也能够发现,里面有一个@的符号,起一个间隔作用,然后就是调用hashCode方法得到该对象的哈希值,并且使用Integer类的toHexString方法将一个十进制int类型的哈希值转换为一个十六进制数,仅此而已。


  那么对于未重写toString方法的具体的类而言到底是不是这样呢?我们可以来举一个例子,比如,我现在有一个Student类(Student类不存放任何的属性与方法,仅仅用来做测试使用),存放在com.hspedu.Object_这个包下面,具体代码编辑如下:

 1 package com.hspedu.Object_;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         
 6     }
 7 }
 8 
 9 class Student {
10
11 }

 

  我再次编辑代码进行测试,定义一个Student对象,调用其继承自Object的toString方法,顺便输出在Student对象的哈希值,如下图所示:

  student对象得到的哈希值是一个十六进制的数据1163157884,将其转换为十六进制就是4554617c了,可以通过计算机验证,如下图所示:

  一般我们在进行Java编程的时候,会重写类的toString方法,一般是将对象的属性的值打印输出。如果我们直接输出对象本身,那么默认情况下,会自动调用toString方法,案例如下

 1 package com.hspedu.Object_;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Student student = new Student("张三",20);
 6         System.out.println(student);
 7     }
 8 }
 9 class Student {
10     private String name;
11     private int age;
12 
13     public Student(String name, int age) {
14         this.name = name;
15         this.age = age;
16     }
17 
18     @Override
19     public String toString() {
20         return "Student{" +
21                 "name='" + name + '\'' +
22                 ", age=" + age +
23                 '}';
24     }
25 }

  运行结果如下图,即打印对象时,会自动调用对象本身的toString方法

   如果对于算法感兴趣,可以参考我另外一个专栏:约瑟夫环问题_小C哈哈哈的博客-CSDN博客_约瑟夫环问题

posted @ 2023-01-09 22:59  C说编程  阅读(1405)  评论(0编辑  收藏  举报