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博客_约瑟夫环问题