簡單的講之所以調用了toString()方法,不是什麽編譯器默認的,而是因為lz妳調用的是out.print()方法
仔細看源代碼,在PringStream類中,print方法是這樣寫的
public void print(Object obj) {
write(String.valueOf(obj));
}
此時調用了String的靜態方法valueof
這個方法是這樣的
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();//註意看,這裏調用了toString方法
}
而所有的java對象都派生自Object,如果沒有對該方法做重寫
則會調用super.toString()
Object中這個方法是這樣定義的
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以打印結果為classname+@hashcode
當重寫了toString方法後,根據java的動態綁定原理,調用的為當前對象的toString()方法,所以當妳重寫了student的toString方法後,打印結果不再是ttt@123456,而是
學號:1
姓名:小明
補充壹點:
作為比較,當調用print(String s)時,雖然同為對象,但並沒有調用toString()方法,打印結果也不是java.lang.String@hashcode了