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類型返回

 

好了!本期就到這里了,說來了慚愧,開通了博客園賬號這么久,第一次寫博客。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM