Java 输出对象,为什么会调用 toString 方法

输出对象结果时?你是发现了, 直接输出对象为什么,自动调用toString() 方法?

不多说了直接测试!

创建User 对象 

class User{
    private int id;
    private String username;

    public User(int id, String username) {
        this.id = id;
        this.username = username;
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                '}';
    }
}

 

输出User对象

System.out.println(new User(1,"admin"));

 

输出结果

User{id=1, username='admin'}

是不是很好奇?明明调用 user 对象 的 toStirng() 方法,输出结果却是重写的 toSting() ,关键点在于 System.out.println(new User(1,"admin"))

   public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

发现输出对象调用了 String.valueOf() ,在点进去 看看 String.valueOf()的源代码

 public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
 }

是不是明白了?原来 默认调用 obj.toString() ,我们知道,Java中,所有对象默认继承了 Object,如果没有重写了toString 方法,那么调用的就是Object对象的 toString() 方法。

Object的 toString() 源代码

public String toString() {
        return getClass().getName() + "@" + 
         Integer.toHexString(hashCode());
 }    

 所以如果没有重写 toString() 方法 ,调用 System.out.println() 输出经常是 完整类名@hashCode的十六进制形式 ,竟然到这里,一起去看看 

Integer.toHexString(hashCode())
 public static String toHexString(int i) {
        return toUnsignedString0(i, 4);
    }

关于 这个方法,源代码的解释是 将整数参数的字符串表示形式返回为基数为 16 的无符号整数。

toHexString() 方法实现

 

 private static String toUnsignedString0(int val, int shift) {
        // assert shift > 0 && shift <=5 : "Illegal shift value";
        int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
        int chars = Math.max(((mag + (shift - 1)) / shift), 1);
        char[] buf = new char[chars];

        formatUnsignedInt(val, shift, buf, 0, chars);

        // Use special constructor which takes over "buf".
        return new String(buf, true);
 }

 

这个方法将 hansCode 以 多少个 shift ,转换为 String类型返回

 

好了!本期就到这里了,说来了惭愧,开通了博客园账号这么久,第一次写博客。

 

posted @ 2022-04-13 15:49  wuxin001  阅读(811)  评论(0编辑  收藏  举报