toString方法的陷阱

toString方法簡介

做用

返回該對象的字符串表示。一般,toString()方法會返回一個「以文本方式表示」此對象的字符串。結果應是一個簡明但易於讀懂的信息表達式。建議全部子類都重寫此方法。java

Object 類的 toString

該方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符「@」和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,默認代碼以下面試

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());  // 也就是返回類名以及該對象的十六進制hashcode 
}

由於它是Object裏面已經有了的方法,而全部類都是繼承Object,因此「全部對象都有這個方法」。
它一般只是爲了方便輸出,好比System.out.println(xx),括號裏面的「xx」若是不是String類型的話,就自動調用xx的toString()方法,一樣的,對於"+"號鏈接的字符串和對象,默認會將對象轉化爲字符串,也會調用該對象的toString方法。
總而言之,它只是sun公司開發java的時候爲了方便全部類的字符串操做而特地加入的一個方法ide

陷阱

代碼

package test160118;

public class TestToString {
    public static void main(String[] args) {
        TestToString t1 = new TestToString();
        System.out.println(t1.toString());
    }
    
    @Override
    public String toString() {
        return "TestToString"+this;
    }
}

分析

  • 代碼重寫了toString方法this

  • 重寫的方法使用了"+"鏈接字符串和thiscode

  • 在調用toString()方法時,進行"TestToString"+this時,會將this這個對象轉化爲String,一樣要調用到this的toString()方法,因而產生了無窮遞歸的陷阱。對象

總結

  • 這個問題是我在面試時遇到的,當時面試官問我toString()可能會遇到哪些陷阱,當時確實沒有想出來繼承

  • 回來之後翻《Thinking in Java》,終於在String那一章找到了答案遞歸

  • 雖然這個問題確實有點偏,可是也確實暴露了我本身基礎知識不牢,讀書不求甚解的壞毛病,之後要改開發

  • 接下來的時間把《Thinking in Java》再從新仔細的過一遍字符串

相關文章
相關標籤/搜索