2013-09-06 16 views
20

私たちはオブジェクトを印刷するたびにtoStringJavaに呼び出されたことを知って、それがすべてのクラスのスーパークラスであるObjectクラスで定義されたデフォルトです。toStringはプリミティブ型に対しても呼び出されますか?

しかし私の先生は、primitive typeint, charなど)を印刷すると、toStringとも呼ばれています。

本当ですか?

答えて

48

はい、ではなく、あなたはそれがあることを期待する意味インチ

System.out.println(someInt) 

も行を追加しますprintための単なるラッパーです。

System.out.print(someInt) 

calls

String.valueOf(someInt) 

ひいてはcalls

Integer.toString(someInt) 

returns a String object representing the specified integerことIntegerクラスにa static methodあります。このメソッドはではなくInteger#toString()と同じであり、Integerオブジェクトをint値を表す文字列に変換するインスタンスメソッドです。

someInt.toString()は、someIntはオブジェクトではないため、Objectとして拡張されません。

+1

'これは(間接的に、おそらく)呼び出すでしょう。なぜでしょうか? – ppeterka

+0

@ ppeterka66ソースが検索され、完了しました。 – hexafraction

+0

あなたのおかげで...本当にありがとう、これは私の最初の質問だったので – Gagan93

0

プリミティブはがそれぞれのオブジェクトタイプにをautoboxedあります。だからtoString()が電話します。

+2

これは間違っています。 'println'はプリミティブでも動作するようにオーバーロードされています。 – arshajii

+0

私は同意しません。 Evgeniy Dorofeevの答えの理由を参照してください。 – Kaadzia

+0

'println()'ではありません。 Evgeniy Dorofeevの答えを見てください。 – Mauren

24

はどのようSystem.out.print(int)作品を見ることができます。System APIによるSystem.outPrintStreamです:

public void print(int i) { 
    write(String.valueOf(i)); 
} 

そして、これがString SRCからString.valueOf(int)です:

public static String valueOf(int i) { 
    return Integer.toString(i); 
} 
+2

非常に良い答えです。理解を助け、次回のソリューションを見つける方法を教えてくれます。 – Kaadzia

+0

'PrintStream'は' final'ではなく、 'PrintStream.print(int)'もありません。このメソッドの動作を変更する新しい派生クラスに 'out'(' setOut'メソッドで)を変更することは可能です。実際には、これはまれに(事実上決して)問題ではありません。特に初心者ではありません。 – luiscubal

1

あれば、我々はそれがint型を出力しますどのように見ることができます

public static final PrintStream out 

SRC PrintStreamで次のコードを検討する

以下の事が起こります
System.out.println(5); 

public void println(int x) { 
    synchronized (this) { 
     print(x); 
     newLine(); 
    } 
} 

内部print(x)機能follows-として

public void print(int i) { 
    write(String.valueOf(i)); 
} 

と文字列の中に、今あなたがのvalueOfを見れば()関数を呼び出しますと呼ばれるPrintStreamクラスからの機能クラス

public static String valueOf(int i) { 
    return Integer.toString(i); 
} 

Integer.toString(i)は、あなたの先生がtoString()メソッドを呼び出すことによってどのようなものかを示しています。

+0

'Integer.toString(i)'は全く自動ボクシングではありません。ここにはオートバイがない。 'println(int)'メソッドがなく、 'println(Object)'のみがあった場合、 'println(5)'によって呼び出され、オートボックスになります。 –

+0

合意!答えを更新しました。 autoboxingは関係しません。 –

+0

素敵で完全な説明。正確なJavaバージョンを追加すると、それがより適切になる可能性がありますが、これはあまり頻繁に変化しないビットです。 – ppeterka

関連する問題