2011-11-15 27 views
0
class test 
{ 
    public static void main(String args[]) 
    { 
     test ob=new test(); 
     String st=new String("it is a string"); 

     System.out.println(ob); 
    System.out.println(st); 
    } 
} 

在此代碼中,ob是測試類的引用,st是字符串類的引用。 而打印ob它顯示參考,但st打印值,即「它是一個字符串」..爲什麼?java中的字符串引用

回答

7

因爲您還沒有在test類中重寫toString(),所以它使用Object(java中所有對象的父類)中僅有的輸出類名稱和哈希碼。

喬希布洛赫概括這個在 「有效的Java」:

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

(參見: 「第9項:始終覆蓋的toString」)

4

如果任意對象上運行println,它會打印其toString()方法(在Object類中定義)生成的字符串表示形式,該類不會覆蓋。默認的實現打印引用(或者那個效果)。

6

因爲字符串類覆蓋了Object類的一個方法toString,它應該打印傳遞給構造函數的東西。但測試班不這樣做。

1

在Java對象上調用打印僅僅是調用默認從對象類繼承的toString()方法。由於String類有一個覆蓋toString()的行爲來打印字符串值,而你的測試類沒有這樣的實現,因此有所不同。

1

有一種方法toString()Object類..
返回該對象的字符串表示形式。通常,toString方法返回一個「文本表示」該對象的字符串。結果應該是一個簡潔但內容豐富的表述,對於一個人來說很容易閱讀。建議所有子類重寫此方法。
所以U可以覆蓋此方法並做ü想做的事......所以String類也重寫此方法並返回字符串而不是對象的Hashcode方法..

1

這是因爲Java爲字符串表示支持作爲文字,編譯器支持將字符串文字自動轉換爲String對象;以及通過使用Object.toString方法從任何引用類型(即Object類的任何子類)自動轉換爲可打印的字符串。

在你的例子中,這裏Java編譯器記錄了對print語句的方法調用的簽名是System.out.toString(String arg)。因此它知道參數必須轉換爲字符串。

1

每一個Java類自動擴展Object類,即使你沒有明確聲明它與Object類包含一個toStrong()方法,用來獲得String代表Object類的實例。Object類的toString()方法用於顯示對象的引用,但不是實際的引用(它只是包含有關引用的信息的文本)。

但是,此方法可能會被其子類重寫,這就是String類所發生的情況。 String類的toString()方法被覆蓋以表示String對象所持有的內容。

現在,當您在對象上使用printprintln方法時,它會調用對象的toString()方法並打印這些值。

對於您的情況,test類沒有覆蓋toString()方法,因此它會打印出Object.toString()給出的任何值。

1

字符串是java中的一個特殊類,您可以在其中保存數據字符串。

默認情況下,每個類都會擴展java.lang.Object,您可以重寫toSring方法來顯示數據在類中的內容。

由於您沒有覆蓋toString,它會打印引用。

另一方面,String類提供了一個toString()的實現返回這個; ///它打印字符串的內容。 }

1

你會看到一個例子太多明確:

class test { 

    @Override 
    public String toString() { 
     return "test={no attributes to print}"; 
    } 

    public static void main(String args[]) { 
     test ob = new test(); 
     String st = new String("it is a string"); 

     System.out.println(ob); 
     System.out.println(st); 
    } 
} 

,並導致:

test={no attributes to print} 
it is a string 

BUILD SUCCESSFUL (total time: 3 seconds)