輸出對象結果時?你是發現了, 直接輸出對象為什么,自動調用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類型返回
好了!本期就到這里了,說來了慚愧,開通了博客園賬號這么久,第一次寫博客。