Java 輸出物件,為什麼會呼叫 toString 方法
阿新 • • 發佈:2022-04-13
輸出物件結果時?你是發現了, 直接輸出物件為什麼,自動呼叫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() { returnid; } 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型別返回
好了!本期就到這裡了,說來了慚愧,開通了部落格園賬號這麼久,第一次寫部落格。