1. 程式人生 > 其它 >Java 輸出物件,為什麼會呼叫 toString 方法

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

 

好了!本期就到這裡了,說來了慚愧,開通了部落格園賬號這麼久,第一次寫部落格。