簡體   English   中英

Java中'System.out.println()'和'toString()'之間的聯系

[英]The connection between 'System.out.println()' and 'toString()' in Java

Java 中System.out.println()toString()之間的聯系是什么? 例如:

public class A {
    String x = "abc";

    public String toString() {
        return x;
    }
}

public class ADemo {
    public static void main(String[] args) {
        A obj = new A();
        System.out.println(obj);
    }
}

如果主類運行,它給出的輸出為"abc" 當我刪除覆蓋toString()的代碼時,它給出的輸出為"A@659e0bfd" 那么,當我將obj對象引用作為參數傳遞給它時,誰能解釋一下System.out.println()的工作原理是什么? 它是否與toString()方法完全連接?

System.out是一個PrintStream Printstream 定義了println()函數的多個版本來處理數字、字符串等。 當您使用任意對象作為參數調用PrintStream.println()時,您將獲得作用於Object的函數版本 這個版本的功能

...首先調用 String.valueOf(x) 以獲取打印對象的字符串值...

查看String.valueOf(Object) ,我們看到它返回

如果參數為空,則字符串等於“空”; 否則,返回 obj.toString() 的值。

因此,長話短說, System.out.println(someObject)調用該對象的toString()函數將對象轉換為字符串表示。

如果您的對象定義了自己的toString()函數,那么它將被調用。 如果您不提供這樣的函數,那么您的對象將從其父類之一繼承toString() 在最壞的情況下,它將繼承Object.toString() 該版本的 toString() 被定義為返回

一個字符串,由對象是其實例的類的名稱、at 符號字符“@”和對象哈希碼的無符號十六進制表示組成。

或者,換句話說:

getClass().getName() + '@' + Integer.toHexString(hashCode())

因此,當您在未定義自己的 toString() 版本的對象上調用System.out.println()時,您可能會得到類似於“classname@someHexNumber”的Object版本。

toString()是所有類都存在於Object類(繼承樹的根toString()中的方法。

System.out.print() (SOP) 將在饋送對象時調用 toString 方法。

如果不覆蓋toString()方法,SOP 將調用父類toString() ,如果 parent 是 Object 類,它將打印對象的 hashCode

如果您覆蓋該方法,SOP 將調用您的toString()方法

System.out.println(obj) 將打印從 obj.toString() 返回的字符串,如果您不覆蓋它,它將調用基礎 object.toString() 方法,默認情況下,類 Object 的 toString 方法返回一個由以下內容組成的字符串對象是其實例的類的名稱,符號字符“@”,以及對象哈希碼的無符號十六進制表示。 換句話說,此方法返回一個等於以下值的字符串:

 getClass().getName() + '@' + Integer.toHexString(hashCode())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM