2016-10-04 130 views
-1

爲什麼輸出? :球體0爲什麼這個Java代碼隱式調用toString()方法?

不知何故,它隱式地調用toString()方法?這個怎麼用 ?

class BerylliumSphere { 
    private static long counter = 0; 
    private final long id = counter++; 
    public String toString() { 
     return "Sphere " + id; 
    } 
} 

public class Test { 
    public static void main (String[] args) { 
     BerylliumSphere spheres = new BerylliumSphere(); 
     System.out.println(spheres); 
    } 
} 

// output: Sphere 0 
+0

有沒有神奇的,它不是,做它的「Java」,但'println'方法。你可以自己實現這樣的方法。 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/io/PrintStream.java#820 –

+1

在println()中傳遞對象總是給出toString表示 – Kahn

+1

這不是「隱含的」,它是「明確的」,只是看看'println'的作用。 – Tom

回答

3

System.outPrintStream實例,它是System的靜態成員。 PrintStream類有一個函數println(),它接受類型爲Object的參數。這個功能,在打開JDK,如下所示:

public void println(Object x) { 
    String s = String.valueOf(x); 
    synchronized (this) { 
     print(s); 
     newLine(); 
    } 
} 

如果你看String.valueOf(),它接受Object類型的參數,可以看到:

public static String valueOf(Object obj) { 
    return (obj == null) ? "null" : obj.toString(); 
} 

有沒有神奇。它只是一個Java類,在對象上調用toString

進一步閱讀

+0

但我不明白爲什麼它使用我在BerylliumSphere類中編寫的toString()方法,因爲我從來沒有調用它? –

+1

您需要了解我的朋友多態性!通過創建你自己的toString(),你已經覆蓋了所有超類中相同函數的實現。 – christopher

1

當您嘗試System.out.println(spheres)它看起來像如下:

public void println(Object x) { 
     String s = String.valueOf(x); 
     synchronized (this) { 
      print(s); 
      newLine(); 
     } 
    } 

這是valueOf(Object obj)方法:

public static String valueOf(Object obj) { 
     return (obj == null) ? "null" : obj.toString(); 
    } 
2

這裏是System.out.println做:https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println%28java.lang.Object%29

它說如下:

此方法調用在第一將String.valueOf(x)用於獲得所述印刷 對象的字符串值,然後行爲就像先調用打印(字符串) 然後調用println()。

這裏是什麼String.valueOf做:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#valueOf%28java.lang.Object%29

它說:

如果參數爲null,則等於 「零」 的字符串;否則,返回obj.toString()的值 。

簡而言之,打印對象將導致調用其toString方法並打印返回的內容。

+0

但是我不明白爲什麼它使用我在BerylliumSphere類中編寫的toString()方法,因爲我從來沒有調用它? –

相關問題