java重寫toString方法
阿新 • • 發佈:2020-10-14
今天來談一下java中toString這個方法。
在初學java的時候,我們學的第一個程式大概都是這樣的:
public static void main(String[] args) {
System.out.println("Hello,world!");
}
可以已經寫得不厭其煩了,哈哈,但是大家想過沒有,假如我直接輸出一個物件會怎麼樣呢?
private String name; private int age; public Test(String name, int age) { this.name = name; this.age = age; } public static void main(String[] args) { Test test = new Test("張三",18); System.out.println(test); }
結果:com.zhang.Test@2503dbd3
乍一看,這是個啥?
實際啊,這是由於我們沒有重寫Object類的toString方法,導致它輸出的是一些古怪的字串(該物件的記憶體地址)。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
通過原始碼我們可以看到它是一個由類名+@符號+物件雜湊碼的無符號十六進位制表示組成。
getClass()是得到一個Class物件,getName()則是 得到這個類的名稱。
當我們在該類重寫toString方法之後,它的結果又不一樣了
private String name; private int age; @Override public String toString() { return "name='" + name + '\'' + ", age=" +age; } public Test(String name, int age) { this.name = name; this.age = age; } public static void main(String[] args) { Test test = new Test("張三",18); System.out.println(test); }
結果:name='張三', age=18
這就是重寫toString之後的好處,我們可以清晰的看到物件的屬性以及它的值。應用也十分廣泛,在平常學習中,我們常常想知道程式碼的正確性以及賦值成功與否,就可以直接列印這個類,在控制檯我們可以清晰的看到資料,不重寫則只是一串記憶體地址。
大家可能還有一個疑惑,就是為什麼我沒有呼叫toString方法,但是他卻輸出了呢?會不會是自動呼叫toString方法呢?
肯定不是自動呼叫。答案如下:
//println方法的原始碼
public void println(Object x) {
String s = String.valueOf(x);//這裡呼叫了valueof方法
synchronized (this) {
print(s);
newLine();
}
}
//valueOf方法的原始碼
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
因為Object類是所有類的父類,所以當我們傳入一個Test類的一個物件test的時候,它會自動向上轉型為Object類。下面的三目運算子可以看出來,返回的是obj.toString(),當我們沒重寫toString的時候它就會呼叫Object類的toString方法,也就是返回記憶體地址,由於Test類重寫了toString方法,所以它會呼叫重寫之後的toString方法,從而看到類屬性的詳細資訊。
如有疑問歡迎下方留言,感謝觀看!